我参照一本关于socket通信的书籍,写了一个接收数据的接收线程。数据是能接收,但返回值总是不太对,麻烦大家帮忙看一下。我采用的是异步通信方式://设置套接字非阻塞模式
nResult = ioctlsocket( g_sockListen, FIONBIO, &arg );我客户端每隔一秒发送一串字符串:hello, da jia hao.服务器端接收结果:
nRet = 80, recv: hello, da jia hao.
nRet = 20, recv:
nRet = 80, recv: hello, da jia hao.
nRet = 20, recv:
nRet = 80, recv: hello, da jia hao.
nRet = 20, recv:
nRet = 80, recv: hello, da jia hao.
nRet = 20, recv:
nRet = 80, recv: hello, da jia hao.
nRet = 20, recv:
nRet = 80, recv: hello, da jia hao.下面是接收线程完整代码:DWORD WINAPI CClient::RecvProc( LPVOID pParam )
{
int nRet = 0;
int nErrorCode = 0;
CClient *pClient = (CClient *)pParam;
while( pClient->m_bRuning )
{
memset( pClient->m_recvData, 0, sizeof(pClient->m_recvData) );
nRet = recv( pClient->m_socket, pClient->m_recvData->buffer, sizeof(pClient->m_recvData->buffer), 0 );
if( SOCKET_ERROR == nRet )
{
nErrorCode = WSAGetLastError();
if( WSAEWOULDBLOCK == nErrorCode )
{
Sleep( SLEEP_TIME_READ );
continue;
}
else if( WSAENETDOWN == nErrorCode || WSAETIMEDOUT == nErrorCode || WSAECONNRESET == nErrorCode )
{
if( WSAECONNRESET == nErrorCode )
{
printf( "客户端: %s %d 断开连接.\n\n", inet_ntoa(pClient->m_addr.sin_addr), pClient->m_addr.sin_port );
}
else
printf( "%s\n", GETERRORINFO("recv") );
break;
}
}
// 客户端关闭了连接
if( 0 == nRet )
{
printf( "客户端: %s %d 断开连接.\n\n", inet_ntoa(pClient->m_addr.sin_addr), pClient->m_addr.sin_port );
break;
} // 收到数据
if( nRet > 0 )
{
pClient->m_recvData->len = nRet;
printf( "nRet = %d, recv: %s\n", nRet, pClient->m_recvData->buffer );
}
} return 0;
}谢谢!!
nResult = ioctlsocket( g_sockListen, FIONBIO, &arg );我客户端每隔一秒发送一串字符串:hello, da jia hao.服务器端接收结果:
nRet = 80, recv: hello, da jia hao.
nRet = 20, recv:
nRet = 80, recv: hello, da jia hao.
nRet = 20, recv:
nRet = 80, recv: hello, da jia hao.
nRet = 20, recv:
nRet = 80, recv: hello, da jia hao.
nRet = 20, recv:
nRet = 80, recv: hello, da jia hao.
nRet = 20, recv:
nRet = 80, recv: hello, da jia hao.下面是接收线程完整代码:DWORD WINAPI CClient::RecvProc( LPVOID pParam )
{
int nRet = 0;
int nErrorCode = 0;
CClient *pClient = (CClient *)pParam;
while( pClient->m_bRuning )
{
memset( pClient->m_recvData, 0, sizeof(pClient->m_recvData) );
nRet = recv( pClient->m_socket, pClient->m_recvData->buffer, sizeof(pClient->m_recvData->buffer), 0 );
if( SOCKET_ERROR == nRet )
{
nErrorCode = WSAGetLastError();
if( WSAEWOULDBLOCK == nErrorCode )
{
Sleep( SLEEP_TIME_READ );
continue;
}
else if( WSAENETDOWN == nErrorCode || WSAETIMEDOUT == nErrorCode || WSAECONNRESET == nErrorCode )
{
if( WSAECONNRESET == nErrorCode )
{
printf( "客户端: %s %d 断开连接.\n\n", inet_ntoa(pClient->m_addr.sin_addr), pClient->m_addr.sin_port );
}
else
printf( "%s\n", GETERRORINFO("recv") );
break;
}
}
// 客户端关闭了连接
if( 0 == nRet )
{
printf( "客户端: %s %d 断开连接.\n\n", inet_ntoa(pClient->m_addr.sin_addr), pClient->m_addr.sin_port );
break;
} // 收到数据
if( nRet > 0 )
{
pClient->m_recvData->len = nRet;
printf( "nRet = %d, recv: %s\n", nRet, pClient->m_recvData->buffer );
}
} return 0;
}谢谢!!
解决方案 »
- 300 分mfc 重叠图片,最顶端图片镂空,在该图片上画线,怎么让设置背景色不为空
- 再DC上画了两个bmp,如何把这俩个bmp做为一个整体做半透?
- 请教有关OPENGL的问题
- 求FAT分配表偏移扇区容量的算法!!!!!!高手,快!!!!!!!!!!1
- 有那位知道计算机各端口的地址,请告知一下。我只知道打印口的地址是:XA378到37A
- 如何捕获键盘按键并转换?在线等,一定给分!!!!
- 超人和蝙蝠侠的最大区别是什么?
- 工程转为Unicode后将strncpy换为_tcsncpy引发的问题。
- .....如果你的水平很高.......如果你很乐意帮助人........请您进来->>>>>>>如果你做出来了,你将获得 120分!...........
- 大家都来看看,有分送的!!!
- SendMessage怎么用
- 新人入场,高手给点经验
char szBuffer[100] = "..."接收每次是80,所以分成了两次了,一个80,一个20。sorry,给分。