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.