使用CSoket多次了,但对于它的block模式的理解并不是很深入。昨天使用csoket的udp多发测试(server接到数据后,需要通过某种方式将数据发送到client,使用tcp方式比较可靠,我一直这样用的,但是比较费时,需要逐一发送),发现了问题:
1)create(),sendto(),receivefrom()....
2)其中,发送方一直定时发送数据无问题;
3)而接收方,通过一个单独的接收线程实现( 注意:csocket不能跨线程使用!主线程中socket create()后,detach()并将sock作为lpvoid传入接收线程 )。代码如下:
//处理接收数据
UINT CSockSvr::DealSvrRevData(LPVOID lParam)
{
......
DWORD dwError;
TCHAR cBuff[1000];
CString sIP;
UINT uPort;
for(;!pDlg->m_bExit;)
{
::memset( cBuff,0,sizeof(cBuff) );
// 如果没有接到数据,一直等待。。。。
// 阻塞模式的弊端:::在退出时候,通过CancelBlockingCall
int iRst=SockSvr.ReceiveFrom( cBuff,sizeof(cBuff),sIP,uPort,0 );
if( iRst!=SOCKET_ERROR )
{
CString sTemp=cBuff;
TRACE1( _T("/r/n Rev Data: %s/r/n"),sTemp );
}
else
{
dwError=GetLastError();
TRACE1( _T("/r/n Rev Data Error code: %d/r/n"),dwError );
}
::Sleep(200);
}
return 0;
}
问题:如果发送