为什么将socket连接设为非阻塞模式时总是连接失败?
下面是小弟的程序,原来未设为阻塞模式时,连接能成功,为什么设为阻塞模式时总是连接失败呢?
arg := 1;
rec := ioctlsocket(hSock,FIONBIO,arg);
//连接服务器
ZeroMemory(@addr, sizeof(addr));
addr.sin_family := AF_INET;
addr.sin_addr.S_addr := inet_addr(pchar(SvrIP));
addr.sin_port := htons(Strtoint(SvrPort));
rec := connect(hSock, addr, sizeof(addr));
//设置连接超时时间为2秒
tmOut.tv_sec := 2;
tmOut.tv_usec := 0;
FD_ZERO(recvSet);
FD_SET(hSock, recvSet);
rec := select(0, @recvSet, nil, nil, @tmOut);
就是上面这一句,网络情况完全正常,可是返回值总为0,不知道为什么?
哪位帮忙看看?谢谢
[解决办法]
rec := select(0, @recvSet, nil, nil, @tmOut);
改成
rec := select(0, nil,@recvSet, nil, @tmOut);
[解决办法]
arg := 1;
rec := ioctlsocket(hSock,FIONBIO,arg);
//连接服务器
ZeroMemory(@addr, sizeof(addr));
addr.sin_family := AF_INET;
addr.sin_addr.S_addr := inet_addr(pchar(SvrIP));
addr.sin_port := htons(Strtoint(SvrPort));
rec := connect(hSock, addr, sizeof(addr));
//设置连接超时时间为6秒
tmOut.tv_sec := 6;
tmOut.tv_usec := 0;
FD_ZERO(recvSet);
FD_SET(hSock, recvSet);
rec := select(0, nil,@recvSet, nil, @tmOut);
1 connect后,如果未连接成功应检测是什么错误,如果错误为WSAEWOULDBLOCK才用select去检测写状态,如果可写,表示连接成功;
2 超时一般设置为6秒;
3 不应该检测读状态,而是检测写状态。