在局域网内,客户端不知道服务器端的ip地址,所以用ip地址依次尝试的方式连接服务器端,将connect设为非阻塞,用select控制超时。现在有如下几个困惑请教各位:在以下列举的情况中,客户端“不能正常连上服务器端”,但这里的“不能正常连上”指的是select返回值不正确,即不为大于0的值。但是服务器端的打印显示accept是成功了的。1,假如服务器端ip地址为...101,我从...92开始依次尝试连接(101是尝试连接的第10个ip),尝试到ip...101时能够连接成功(即select返回大于0的值)。但是只要从小于92的ip开始依次尝试连接,就不能成功(select的超时时间设为100ms,但是我试着改为200、300ms,照样不行);
2,如果执行调试,即单步跟踪什么的,能连接成功;
3,如果将select的超时改为2秒以上,就能一切正常。我对以上的现象相当困惑,请各位帮助。关键部分代码如下:
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct fd_set writeSet;
struct timeval timeConn;
u_long opt = 1;ioctlsocket(sock, FIONBIO, &opt);writeSet.fd_count = 1;
writeSet.fd_array[0] = sock;/*现在是200ms,不行,改为几百ms都不行*/
timeConn.tv_sec = 0;
timeConn.tv_usec = 200 * 1000;/*这样就行了*/
/*timeConn.tv_sec = 2;
timeConn.tv_usec = 0;*/if (0 != connect(sock, (struct sockaddr*)&addr, sizeof(addr)))
{
    if (select(1, NULL, &writeSet, NULL, &timeConn) > 0)
    {
        opt = 0;
        ioctlsocket(sock, FIONBIO, &opt);
        printf("Connect succeed!");
    }
    else
    {
        printf("Connect failed!");/*不正常的时候分支走到这里,但是服务器端已经accept成功了……*/
        closesocket(sock);
    }
}
else
{
    opt = 0;
    ioctlsocket(sock, FIONBIO, &opt);
    printf("Connect succeed!");
}