C:套接字连接超时

我有一个简单的程序来检查端口是否打开,但是我想缩短套接字连接的超时时间,因为默认值太长了。我不确定如何执行此操作。这是代码:


#include <sys/socket.h>

#include <sys/time.h>

#include <sys/types.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include <errno.h>

#include <fcntl.h>

#include <stdio.h>

#include <netdb.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>


int main(int argc, char **argv) {

    u_short port;                /* user specified port number */

    char addr[1023];             /* will be a copy of the address entered by u */

    struct sockaddr_in address;  /* the libc network address data structure */

    short int sock = -1;         /* file descriptor for the network socket */


    if (argc != 3) {

        fprintf(stderr, "Usage %s <port_num> <address>", argv[0]);

        return EXIT_FAILURE;

    }


    address.sin_addr.s_addr = inet_addr(argv[2]); /* assign the address */

    address.sin_port = htons(atoi(argv[2]));            /* translate int2port num */


    sock = socket(AF_INET, SOCK_STREAM, 0);

    if (connect(sock,(struct sockaddr *)&address,sizeof(address)) == 0) {

        printf("%i is open\n", port);

    }  

    close(sock);

    return 0;

}


哔哔one
浏览 646回答 3
3回答

梦里花落0921

关于使用select()/ 的答案poll()是正确的,应该以这种方式编写代码以便于移植。但是,由于您使用的是Linux,因此可以执行以下操作:int synRetries = 2; // Send a total of 3 SYN packets => Timeout ~7ssetsockopt(fd, IPPROTO_TCP, TCP_SYNCNT, &synRetries, sizeof(synRetries));请参阅man 7 tcp和man setsockopt。我使用它来加快我需要快速修补的程序中的连接超时。不能通过select()/将其黑客破解为超时poll()。
打开App,查看更多内容
随时随地看视频慕课网APP