winsock怎样设置传输方式为异步;
我现在做一个文件传输的程序,当server在一个while循环里发送数据时(比如36K的文件需循环36次),client只能响应一个FD_READ,而在while循环里加一个Sleep(500)则Client可以响应36次,这是不是与传输方式有关。
代码如下:
if( recv(Clients[Client].sConns, Receive, 255, 0 )==SOCKET_ERROR )//接收CLient端要求发送的文件名
{
nSockErr=WSAGetLastError();
if( nSockErr==10035 ) return FALSE;
char Err[100];
sprintf(Err,"error on (recv) %d",nSockErr);
AfxMessageBox(Err);
return FALSE;
}
if( Receive[0]==0 ) return FALSE;
if (_access(Receive,0)==0)//如果该文件存在
{
CFile myFile;
if(!myFile.Open(Receive, CFile::modeRead | CFile::typeBinary))
{
return 1;
}
SOCKET_STREAM_FILE_INFO StreamFileInfo;
WIN32_FIND_DATA             FindFileData;
FindClose(FindFirstFile(Receive,&FindFileData));
memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));
   // strcpy(StreamFileInfo.szFileTitle,myFile.GetFileTitle());
strcpy(StreamFileInfo.szFileTitle,myFile.GetFileName());//获得文件名包括扩展名//.GetFileTitle());
StreamFileInfo.dwFileAttributes     =       FindFileData.dwFileAttributes;
StreamFileInfo.ftCreationTime       =       FindFileData.ftCreationTime;
StreamFileInfo.ftLastAccessTime     =       FindFileData.ftLastAccessTime;
StreamFileInfo.ftLastWriteTime      =       FindFileData.ftLastWriteTime;
StreamFileInfo.nFileSizeHigh        =       FindFileData.nFileSizeHigh;
StreamFileInfo.nFileSizeLow         =       FindFileData.nFileSizeLow;
// sprintf(pSendData.data,"%s",StreamFileInfo);
// pSendData.flag=1;
send(Clients[Client].sConns,(char*)&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO),0);//发送文件信息
UINT dwRead=0;
byte* data = new byte[1024];
MSG Message;
while(dwRead<StreamFileInfo.nFileSizeLow)
{
UINT dw=myFile.Read(data, 1024);
int dw1=send(Clients[Client].sConns,(char*)data, 1024,0);//发送文件数据
dwRead+=dw;
if(PeekMessage(&Message,NULL,0,0,PM_REMOVE)){
TranslateMessage(&Message);
DispatchMessage(&Message);
}
Sleep(100);
}
myFile.Close();
delete data;
}

解决方案 »

  1.   

    在vc下可以从CSocket派生一个类,然后重载OnReceive(...)就可以了
      

  2.   

    我是用WSAAsyncSelect(sClntSock, ::GetActiveWindow(), WM_USER+999, FD_READ|FD_WRITE|FD_CLOSE;
      

  3.   

    我也遇到过类似的问题 解决的办法和你的也相似 只不过把Sleep(100)加在了循环体的外面
    while(dwRead<StreamFileInfo.nFileSizeLow)
    {
    UINT dw=myFile.Read(data, 1024);
    int dw1=send(Clients[Client].sConns,(char*)data, 1024,0);//发送文件数据
    dwRead+=dw;
    if(PeekMessage(&Message,NULL,0,0,PM_REMOVE)){
    TranslateMessage(&Message);
    DispatchMessage(&Message);
    }

    }
                      Sleep(100);
    myFile.Close();
    delete data;