首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

大侠们帮忙看一下,为什么小弟我一到recv()就卡住了呢

2013-03-26 
大侠们帮忙看一下,为什么我一到recv()就卡住了呢?程序中有一段如下面代码,往svr_conn中写入了hostname,id

大侠们帮忙看一下,为什么我一到recv()就卡住了呢?
  程序中有一段如下面代码,往svr_conn中写入了hostname,id等信息,但是我不论在哪调用recv()函数,都是运行到recv()就停在这,百度了一下recv(),好像是在等待,是吗?那我怎样才让它运行过去呢? 
        char sb[500]= {0}, rst;
        gethostname(sb, 500);
send(svr_conn,sb,strlen(sb),0);
        sb[0] = '\01';
send(svr_conn,sb,1,0);
        recv(svr_conn, &rst, 1, 0);

其中svr_conn = socket(AF_INET, SOCK_STREAM, 0);
我这是在做从linux移植到windows的工作,recv()函数以前在linux下是read(svr_conn, &rst, 1),大侠们看看该如何修改啊?万分感谢···
[解决办法]
你可能用的阻塞模式.你改成非阻塞
[解决办法]
调用recv,如果对方没有数据过来就阻塞住了。只有下面情况才会返回:
a. 对方向你发送了数据;
b. 对方关闭了连接。

建议用异步 socket或同步非阻塞socket,用select确定何时数据到达。
[解决办法]
WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT, FD_ACCEPT 
[解决办法]
 FD_CLOSE 
[解决办法]
 FD_READ 
[解决办法]
 FD_WRITE)

非阻塞设置
[解决办法]
recv默认是阻塞的,就是要一直等待有消息或者网络异常中断等情况出现,你应该使用一个独立的线程一直接收消息,不要在主线程中处理,也可以使用非阻塞的方式,使用事件模式(内部实现实际也是一个线程在等待)

热点排行