大侠们帮忙看一下,为什么我一到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默认是阻塞的,就是要一直等待有消息或者网络异常中断等情况出现,你应该使用一个独立的线程一直接收消息,不要在主线程中处理,也可以使用非阻塞的方式,使用事件模式(内部实现实际也是一个线程在等待)