我有一个简单的程序来检查端口是否打开,但是我想缩短套接字连接的超时时间,因为默认值太长了。我不确定如何执行此操作。这是代码:#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;}
3 回答
梦里花落0921
TA贡献1772条经验 获得超6个赞
关于使用select()/ 的答案poll()是正确的,应该以这种方式编写代码以便于移植。
但是,由于您使用的是Linux,因此可以执行以下操作:
int synRetries = 2; // Send a total of 3 SYN packets => Timeout ~7s
setsockopt(fd, IPPROTO_TCP, TCP_SYNCNT, &synRetries, sizeof(synRetries));
请参阅man 7 tcp和man setsockopt。
我使用它来加快我需要快速修补的程序中的连接超时。不能通过select()/将其黑客破解为超时poll()。
- 3 回答
- 0 关注
- 645 浏览
添加回答
举报
0/150
提交
取消