Bonjour � tous.
Voil� je suis en train de cr�er un serveur FTP et j'ai quelques soucis. Lorsque je dois envoyer des donn�es (un fichier par exemple) sur le canal de donn�es je fais :
et dans OnSend j'ai
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 ///////////////////////////////////////////////////////////////////////////// BOOL CNEOFtpDataSocket::SendFile(CString p_strFilePathName) ///////////////////////////////////////////////////////////////////////////// { TRACE("CNEOFtpDataSocket::SendFile::BEGIN\n"); // open source file if (!m_cFile.Open(p_strFilePathName, CFile::modeRead | CFile::shareDenyNone | CFile::typeBinary)) { return FALSE; } m_nTotalBytesToSend = m_cFile.GetLength(); m_nTotalBytesTransfered = 0; TRACE("CNEOFtpDataSocket::SendFile::before OnSend\n"); OnSend(0); TRACE("CNEOFtpDataSocket::SendFile::END\n"); return TRUE; }
Lors de l'execution, lorsque le socket se trouve bloqu� (l_dwError == WSAEWOULDBLOCK) je sors de la boucle et de la fonction OnSend. La le systeme rappelle l'evenement OnSend et l'envoi continue.
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 BYTE l_bData[NEO_PACKET_SIZE]; while (m_nTotalBytesTransfered < m_nTotalBytesToSend) { m_cFile.Seek(m_nTotalBytesTransfered, CFile::begin); l_nDataRead = m_cFile.Read(l_bData, NEO_PACKET_SIZE); l_nDataSend = Send(l_bData, l_nDataRead); if (l_nDataSend == SOCKET_ERROR) { // Transfer error DWORD l_dwError; l_dwError = GetLastError(); if (l_dwError == WSAEWOULDBLOCK) { Sleep(0); break; } else { // Closing file m_cFile.Close(); m_cFile.m_hFile = NULL; // Closing socket Close(); // Change status m_pControlSocket->m_nStatus = NEO_STATUS_IDLE; m_nTotalBytesToSend = 0; m_nTotalBytesTransfered = 0; // Send a response to client l_strResponse = NEO_RESPONSE_TRANSFER_ABORTED; m_pControlSocket->Send(l_strResponse , l_strResponse.GetLength()); m_pControlSocket->DisplayMessage(l_strResponse); } } else { m_nTotalBytesTransfered += l_nDataRead; } }
Par contre lors de certaines execution lorsque le Socket est occup� je sors de la boucle et la rien ne se passe plus la fonction OnSend n'est pas rappel�e par le systeme. Je ne comprend pas. Si qq un pouvais m'eclairer.
Encore merci d'avance.
Partager