socket阻塞问题

小雨好赖床 2012-08-16 02:53:05
自己写了一个socket服务端程序做测试用
但是发现recv没有阻塞,求高手解答

void TestSocketServer( void )
{

WSADATA wsaData;
if (WSAStartup(0x0202, &wsaData)!=0)
{
return;
}

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

int nRet = 0;
fd_set fd;

while(1)
{
FD_ZERO(&fd);
FD_SET(sockConn, &fd);

nRet = select(0, &fd, NULL, NULL, NULL);

if (nRet == SOCKET_ERROR)
{
closesocket(sockConn);
return ;
}
else if (nRet == 0)
{
closesocket(sockConn);
return ;
}

if (FD_ISSET(sockConn, &fd))
{
MSG_HEADER msg1;
int len = recv(sockConn, (char*)&msg1, sizeof(MSG_HEADER), 0);
if (len <= 0)
{//总是在这个地方接收0长度,完全没有阻塞
continue;
}

switch (msg1.msgType)
{
case C_CMD_LOGIN:
{
//send(sockConn, (char *)&lgmsg, sizeof(LoginMsg_S), 0);
}
break;
case C_CMD_HEARD:
{

}
break;
case C_CMD_REGISTR:
{

}
break;
case C_CMD_RESOLVE:
{

//send(sockConn, (char *)&lgmsg, sizeof(LoginMsg_S), 0);
}
break;
}
}
}
closesocket(sockConn);

}


求帮助....
...全文
68 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
傻X 2012-08-16
  • 打赏
  • 举报
回复
nRet = select(0, &fd, NULL, NULL, NULL);
这个本身就阻塞的

竟然可以进入recv,说明Accept成功。

那就是说你实际就是没数据收到呀。客户端是不是没发数据过来
小雨好赖床 2012-08-16
  • 打赏
  • 举报
回复
额,原来是这样,一直在找服务端问题,忘记我客户端的socket断掉了,终于解决了,多谢
linux_gcc99 2012-08-16
  • 打赏
  • 举报
回复
查看了一下,服务端代码应该是没有问题的
rcve如果是0 应该是 socket断掉了
你服务端的关闭在循环外面,应该不是服务端问题
你去看看你客户端的socket是不是关闭掉了
youngwolf 2012-08-16
  • 打赏
  • 举报
回复
客户端有问题,它已经关闭了,所以你recv返回0

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧