Bonjour,

J'ecris en ce moment un petit client ftp pour un usage perso.
Tout se passe bien jusqu'au moment du RETR ...
Après le PASV je récupère bien l'ip que m'envoie le serveur avec le port et A priori le Socket est bien créé, le Bind et le Listen posent pas de pb, mais la commande accept, bien qu'elle réponde sans erreur est elle correcte ?
Est ce que je fais bien les choses ???
Il doit y avoir une raison, mais j'ai fouillé un peu partout, sans rien trouver de très concret...

Si un amateur de Socket, de ftp en C pouvait m'éclairer ...

Merci d'avance

Voici le code en question
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//
              iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
//
              host = gethostbyname(hostname);
			  if (host == NULL) {
                sprintf_s(wbuf, sizeof(wbuf), "La resolution a échouée : %d\n", WSAGetLastError());
                MessageBox(hwnd, wbuf, "Client HelpDesk", MB_OK|MB_ICONINFORMATION);
                return 0;
			  }
//
              ListenSocket = socket(AF_INET, SOCK_STREAM, 0);
              memset((char *)&service,'0',sizeof(service));
//              service.sin_addr.s_addr = inet_addr("192.168.10.2");
              service.sin_addr.s_addr = *(u_long *) host->h_addr_list[0];
              service.sin_family = AF_INET;
              service.sin_port = htons(DEFAULT_PORT);
//
			  if (iResult=connect(ListenSocket, (SOCKADDR *)&service, sizeof(service)) == S_OK) {
                recv(ListenSocket, buffer_io, sizeof(buffer_io), 0);
                MessageBox(hwnd, buffer_io, "Reponse connect", MB_OK|MB_ICONINFORMATION);
//
                strcpy_s(wbufP, sizeof(wbufP), "USER xxxxxxx\r\n");
                send(ListenSocket, wbufP, strlen(wbufP), 0);
 
                memset (buffer_io, '\x00', sizeof(buffer_io));
                recv(ListenSocket, buffer_io, sizeof(buffer_io), 0);
                MessageBox(hwnd, buffer_io, "Reponse USER", MB_OK|MB_ICONINFORMATION);
//
                strcpy_s(wbufP, sizeof(wbufP), "PASS xxxxxxxxxxx\r\n");
                send(ListenSocket, wbufP, strlen(wbufP), 0);
//
                memset (buffer_io, '\x00', sizeof(buffer_io));
                recv(ListenSocket, buffer_io, sizeof(buffer_io), 0);
                MessageBox(hwnd, buffer_io, "Reponse PASS", MB_OK|MB_ICONINFORMATION);
//
//
                strcpy_s(wbufP, sizeof(wbufP), "PASV\r\n");
                send(ListenSocket, wbufP, strlen(wbufP), 0);
//
                memset (buffer_io, '\x00', sizeof(buffer_io));
                recv(ListenSocket, buffer_io, sizeof(buffer_io), 0);
                MessageBox(hwnd, buffer_io, "Reponse PASV", MB_OK|MB_ICONINFORMATION);  //227
//
                portdata=RecupPort(hwnd, buffer_io);
                _itoa_s (portdata, wbuf, sizeof(wbuf), 10);
				        MessageBox(hwnd, wbuf, "Port PASV", MB_OK|MB_ICONINFORMATION);
//
//
              memset(&localaddr,0,sizeof(localaddr));
              memset(&remoteaddr,0,sizeof(remoteaddr));
//
              s = socket(AF_INET, SOCK_STREAM, 0);
              localaddr.sin_family = AF_INET;
              localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
              for( i = min_port; i <= max_port; i++){
		            localaddr.sin_port = htons(i);
                if(0 <= bind(s,(struct sockaddr *)(&localaddr),sizeof(struct sockaddr)))
                  break;
              }
//
              strcpy_s(wbufP, sizeof(wbufP), "RETR exemple.txt\r\n");
              send(ListenSocket, wbufP, strlen(wbufP), 0);
//
              listen(s,5);
              remoteaddr.sin_family = AF_INET;
			        remoteaddr.sin_port = htons(portdata);
              remoteaddr.sin_addr.s_addr = inet_addr("192.168.10.3");
              len = sizeof(remoteaddr);
              nc = accept(s,(struct sockaddr *)(&remoteaddr), &len);
			        if (nc <0 ) {
				        sprintf_s(wbuf, sizeof(wbuf), "accept failed! %d \n", WSAGetLastError());
				        MessageBox(hwnd, wbuf, "FTP Client", MB_OK|MB_ICONINFORMATION);
				        exit(0);
			        }
              sprintf_s(recvbuf, sizeof(recvbuf), "accepted a connection from IP %s port %d \n",inet_ntoa(remoteaddr.sin_addr),ntohs(remoteaddr.sin_port));
              MessageBox(hwnd, recvbuf, "FTP Client", MB_OK|MB_ICONINFORMATION);
//PORT
//
				      while(1) {
                 i=recv(nc, recvbuf, sizeof(recvbuf), 0);
				        if (i<0) break;
                  MessageBox(hwnd, recvbuf, "Reponse data de RETR", MB_OK|MB_ICONINFORMATION);
				      }
              closesocket(nc);
//
                memset (buffer_io, '\x00', sizeof(buffer_io));
                recv(ListenSocket, buffer_io, sizeof(buffer_io), 0);
                MessageBox(hwnd, buffer_io, "Reponse RETR", MB_OK|MB_ICONINFORMATION); 
//
 
 
                                                                                        //226 Transfer complete.
//Fermeture socket data
//
			  }
			  else {
                sprintf_s(wbuf, sizeof(wbuf), "La connexion au serveur a échouée : %d\n", WSAGetLastError());
                MessageBox(hwnd, wbuf, "Client HelpDesk", MB_OK|MB_ICONINFORMATION);
                closesocket(ListenSocket);
                WSACleanup();
                ListenSocket = INVALID_SOCKET;  //Uniquement pour l'affichage WM_PAINT
                status_c=0;
			    InvalidateRect (hwnd, &rect, TRUE);
			  }
La log du serveur (Gene6Ftp)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15/05/04 18:11:53, 703, 192.168.10.2, , new connection from 192.168.10.2 on 192.168.10.3:21 (Explicit SSL)
15/05/04 18:11:53, 703, 192.168.10.2, , hostname resolved : PC1
15/05/04 18:11:53, 703, 192.168.10.2, , sending welcome message.
15/05/04 18:11:53, 703, 192.168.10.2, , 220 Gene6 FTP Server v3.10.0 (Build 2) ready...
15/05/04 18:11:56, 703, 192.168.10.2, , USER utilisateur
15/05/04 18:11:56, 703, 192.168.10.2, utilisateur, 331 Password required for utilisateur.
15/05/04 18:11:57, 703, 192.168.10.2, utilisateur, PASS ****
15/05/04 18:11:57, 703, 192.168.10.2, utilisateur, logged in as "utilisateur".
15/05/04 18:11:57, 703, 192.168.10.2, utilisateur, 230 User utilisateur logged in.
15/05/04 18:11:59, 703, 192.168.10.2, utilisateur, PASV
15/05/04 18:11:59, 703, 192.168.10.2, utilisateur, 227 Entering Passive Mode (192,168,10,3,156,75)
15/05/04 18:12:03, 703, 192.168.10.2, utilisateur, RETR exemple.txt
15/05/04 18:12:03, 703, 192.168.10.2, utilisateur, asked to download '/exemple.txt' -> 'E:\mainserver\www\exemple.txt' from 0 --> Access allowed.
15/05/04 18:12:33, 703, 192.168.10.2, utilisateur, 425 Cannot open data connection.