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

为什么将socket连接设为非阻塞模式时总是连接失败?该如何解决

2012-03-07 
为什么将socket连接设为非阻塞模式时总是连接失败?下面是小弟的程序,原来未设为阻塞模式时,连接能成功,为

为什么将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 不应该检测读状态,而是检测写状态。

热点排行