关于recv的阻塞与非阻塞?

sjjwind 2011-11-19 10:02:02
我在网上查了下,没有改变设置的情况下recv函数都是阻塞的,也就是说会等待信息接受,可是我的却是非阻塞的,一直接受空字符,程序停不下来,我是准备把接受放到线程里,要设置成阻塞的,请问要怎么做,我的代码如下:
#include "stdafx.h"
#include "WinSock2.h"
#include "windows.h"
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
WSADATA wsadata;
WORD nVersion = MAKEWORD(1,1);
int err = WSAStartup(nVersion,&wsadata);
if(err != 0)
{
return 0;
}
if(LOBYTE(wsadata.wVersion)!=1 || HIBYTE(wsadata.wVersion) != 1)
{
WSACleanup();
return 0;
}

SOCKADDR_IN m_RecvAddr;
m_RecvAddr.sin_family = ADDR_ANY;
m_RecvAddr.sin_port = htons(6666);
m_RecvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
SOCKET m_RecvSocket = socket(AF_INET,SOCK_STREAM,0);
bind(m_RecvSocket,(SOCKADDR*)&m_RecvAddr,sizeof(SOCKADDR));
listen(m_RecvSocket,5);
int len = sizeof(SOCKADDR);
SOCKADDR_IN m_sockClient;
while(true)
{
char* pBuffer = new char[50];
SOCKET tmp = accept(m_RecvSocket,(SOCKADDR*)&m_sockClient,&len);
memset(pBuffer,0,sizeof(pBuffer));
recv(tmp,pBuffer,50,0);
cout<<pBuffer<<endl;
closesocket(tmp);
}
return 0;
}



...全文
384 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjjwind 2011-11-19
  • 打赏
  • 举报
回复
我在bind和listen下都加了判断,发现bind就失败了,这是什么原因呢?上面有个错误 协议族我改成了AF_INET 可bind还是失败,求指导。
gold_water 2011-11-19
  • 打赏
  • 举报
回复
照你说的,估计是accept失败了,返回的SOCKET是非法的; recv(tmp,pBuffer,50,0);估计也是异常结束;所以没有阻塞现象,结果也异常.
sjjwind 2011-11-19
  • 打赏
  • 举报
回复
这一句我改了,呵呵,现在连接正常了。
w_yizhou 2011-11-19
  • 打赏
  • 举报
回复
m_RecvAddr.sin_family = ADDR_ANY;
这句也错了。
sjjwind 2011-11-19
  • 打赏
  • 举报
回复
我自己找出错误了,谢谢各位
w_yizhou 2011-11-19
  • 打赏
  • 举报
回复
m_RecvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

这里有问题,改为:
m_RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
Eleven 2011-11-19
  • 打赏
  • 举报
回复
winsock函数调用的地方看看函数的返回值是什么?成功调用了没?

18,356

社区成员

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

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