客户端程序基于TCP/IP连接服务器 int err;
//设置非阻塞方式连接
unsigned long ul = 1;
err = ioctlsocket(ConnectSocket, FIONBIO, (unsigned long*)&ul);
if(err == SOCKET_ERROR)
{
return;
}
connect(ConnectSocket,(const struct sockaddr *)&AddrConnect,sizeof(AddrConnect));
//select 模型设置超时
struct timeval timeout ;
fd_set r;

FD_ZERO(&r);
FD_SET(ConnectSocket, &r);
timeout.tv_sec = 20; //连接超时20秒
timeout.tv_usec =0;
err = select(0, 0, &r, 0, &timeout);
if ( err <= 0 )
{
::closesocket(ConnectSocket);
return;
}
//非锁定模式套接设回阻塞模式
unsigned long ul1= 0 ;
err = ioctlsocket(ConnectSocket, FIONBIO, (unsigned long*)&ul1);
if(err==SOCKET_ERROR)
{
::closesocket (ConnectSocket);
return;
}
其中connect和select都是放在线程中处理的
会不会因连接的超时而引起线程的挂起?

解决方案 »

  1.   

    但是select可以设置超时啊
    我就是判断socket上是否可以写数据,从而判断是否连接成功
      

  2.   

    int err = connect(socket,(const struct sockaddr *)&AddrConnect,sizeof(AddrConnect));
    //select 模型设置超时
    struct timeval timeout;
    fd_set r;

    FD_ZERO(&r);
    FD_SET(ConnectSocket, &r);
    timeout.tv_sec = 20; //连接超时20秒
    timeout.tv_usec =0;
    err = select(0, 0, &r, 0, &timeout);
    if ( err <= 0 )
    {
    g_bNetFlag = FALSE;
    ::closesocket(socket);
    return 5;
    }
    else
    {
    g_bNetFlag = TRUE;
    }上面是连接部分的代码,代码绝对没问题
    HANDLE hThread;
    hThread = CreateThread(NULL,0,ThreadLINK,(LPVOID)LINKPORT,0,NULL);
    Sleep(4000);//Sleep的时间设置短些的时候就连接不上了,长的时候就可以
    CloseHandle(hThread);
      

  3.   

    如果你设置是异步模式的话,connect可能不会立刻成功,
    你要到下面的select(0, 0, &r, 0, &timeout);设置等待时间判断有没有连接成功
      

  4.   

    我设置的是同步模式
    connect也不能立刻成功
      

  5.   

    你的代码当select失败就直接退出线程了,这个是不合适的,select失败也许是阻塞了。你应该在失败后获取失败代码,如果是阻塞引起的失败,应该过一段时间(比如几个毫秒后)再尝试,这样才是正确的。在同步模式下的connect如果说成功,你也应该使用获取失败代码来看看失败的原因。
    按我说的自己调试一下。希望对你有帮助。我的电邮:[email protected]    希望可以和大家交流相关的技术。
      

  6.   

    在同步模式下的connect如果不成功
    对不起   打错字了