我尝试了以下方法:
int sockfd = socket(...);
listen(sockfd, 10);
accept(sockfd, ...);
没有一个调用失败,并且程序开始阻塞,就像我调用了bind()一样。在这种情况下会发生什么?由于没有本地地址或端口,是否永远无法接收连接?或者它是否隐式分配了一个本地地址和端口,现在它正在侦听这些?如果是这样,我怎样才能检索这些内容?
这些调用正在工作,但由于您没有显式绑定套接字,操作系统或系统库会隐式为您分配一个端口和默认绑定(与您调用时完全相同)connect(2)
不打电话bind(2)
第一的)。另外,既然您之前询问过 TCP 的问题,我假设您在这里谈论的是互联网套接字。
找出操作系统将套接字绑定到的名称因操作系统而异,因此您必须查找特定的操作系统,但大多数操作系统都提供netstat
或类似的工具,您可以使用它来查询哪些应用程序正在侦听哪些端口。
正如约翰在评论中提到的,你可以使用getsockname(2)
查找绑定套接字的名称。这是一个简短的例子:
// ...
// Create socket and set it to listen (we ignore error handling for brevity)
int sock = socket(AF_INET, SOCK_STREAM, 0);
listen(sock, 10);
// Sometime later we want to know what port and IP our socket is listening on
socklen_t addr_size = sizeof(struct sockaddr_in);
struck sockaddr_in addr;
getsockname(sock, (struct sockaddr *)&addr, &addr_size);
addr
现在将包含您的套接字正在侦听的 IP 地址和端口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)