我正在尝试学习套接字编程,并且我有以下函数来设置套接字:
29 int CreatePassiveSock(char *protocol, char *portstr, int qlen) {
30 int s, port, type, saddrlen;
31 char *endptr;
32 struct sockaddr_in saddr;
33 port = (int) strtol(portstr, &endptr, 10);
34 if (*endptr) {
35 printf("\nPlease specify a positive integer for port\n");
36 exit(1);
37 }
38 saddrlen = sizeof(saddr);
39 memset(&saddr, 0, saddrlen);
40 saddr.sin_family = AF_INET;
41 saddr.sin_addr.s_addr = INADDR_ANY;
42 saddr.sin_port = htons(port);
43 if (strcmp("tcp", protocol) == 0)
44 type = SOCK_STREAM;
45 else if (strcmp("udp", protocol) == 0)
46 type = SOCK_DGRAM;
47 else {
48 printf("Unsupported protocol given");
49 exit(1);
50 }
51 if ((s = socket(PF_INET, type, 0)) == -1){
52 perror("socket call failed");
53 exit(1);
54 }
55 if (bind(s, (struct sockaddr *)&saddr, saddrlen) == -1) {
56 perror("Bind failed");
57 exit(1);
58 }
59 if (type == SOCK_STREAM) {
60 if (listen(s, qlen) == -1) {
61 perror("listen failed");
62 exit(1);
63 }
64 }
65 return s;
66 }
当我使用 6001 作为端口号调用它时,这是显示的行netstat -a | head
tcp 0 0 0.0.0.0:x11-1 0.0.0.0:* LISTEN
为什么会显示为 0.0.0.0:x11-1?我不应该得到 0.0.0.0:6001 吗?
如果重要的话,我会在运行 PopOS 的笔记本电脑上执行此操作。
答案1
TCP 端口 6001 被标识为x11-1
,/etc/services
因此netstat
使用该标签显示它:以与查找与其找到的 IP 地址对应的主机名的方式类似的方式,它查找与其找到的端口号对应的服务名称。看man 5 services
有关其描述/etc/services
以及用于访问它的函数,X 客户端如何知道它们需要连接到 TCP 端口 6000+<显示编号>?有关 6000+ 范围端口号映射的说明。
您可以检查/etc/services
您的系统上有哪些服务是已知的;官方注册表由 IANA 维护,你可以找到X11 作业也在那里。
您可以netstat
使用强制显示端口号-n
。