Pb avec CAsyncSocket (MFC)
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:
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:
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.