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 :
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;
}
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
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;
			}
		}
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.

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.