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