相关疑难解决方法(0)

在非阻塞套接字连接中,select()始终返回1

我有这个代码段,旨在使用套接字连接连接到服务器.但是,如果它无法在一定时间内连接到服务器,我希望它停止尝试.我尝试使用这个非阻塞套接字和select命令执行此操作,但select总是返回1,表示当我提供的地址不存在时服务器存在.有任何想法吗?

SOCKET tcp_client( char *hname, char *sname )  {    
    fd_set fdset;
    struct sockaddr_in peer;
    SOCKET s;
    FD_ZERO(&fdset);
    // FD_SET(STDIN, &fdset);
    FD_SET(s, &fdset);
    errno=1;
    struct timeval tv;
    tv.tv_sec = 15;
    set_address( hname, sname, &peer, "tcp" );
    s = socket( AF_INET, SOCK_STREAM, 0 );

    int n = 1;
    fcntl(s, F_SETFL, O_NONBLOCK);

    if ( !isvalidsock( s ) )
    {
        printf("Socket Call Failed: %s\n", strerror(errno));
        return(0);
    }

    int x = 0;

    int status = connect( s, ( struct sockaddr * )&peer, sizeof( peer ) …
Run Code Online (Sandbox Code Playgroud)

c sockets select nonblocking connect

7
推荐指数
2
解决办法
1万
查看次数

对非阻塞套接字使用select()总是返回1

这个问题与(非常接近)在非阻塞套接字连接中,select()始终返回1;但是,我似乎找不到我的代码步履蹒跚的地方。

我正在使用非阻塞套接字,并且想在将客户端连接到服务器以检查超时/成功时使用select()。问题是select()几乎总是立即返回1,即使我什至没有服务器在运行,也没有什么可连接的。预先感谢您的帮助,代码片段如下:

//Loop through the addrinfo structs and try to connect to the first one we can
for(p = serverinfo; p != NULL; p = p->ai_next) {
    if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) 
    {
        //We couldn't create the socket, try again
        perror("client: socket");
        continue;
    }

    //Set the socket to non-blocking
    int flags = fcntl(sockfd, F_GETFL, 0);
    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);

    if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
        //The error was something other than non-block/in progress, …
Run Code Online (Sandbox Code Playgroud)

c sockets select nonblocking

5
推荐指数
1
解决办法
3万
查看次数

标签 统计

c ×2

nonblocking ×2

select ×2

sockets ×2

connect ×1