Cla*_*diu 10 language-agnostic networking network-programming tcp
我尝试了以下方法:
int sockfd = socket(...);
listen(sockfd, 10);
accept(sockfd, ...);
Run Code Online (Sandbox Code Playgroud)
没有任何调用失败,程序刚刚开始阻塞,好像我调用了bind().在这种情况下会发生什么?是否只是不可能接收连接,因为它没有本地地址或端口?或者它是否隐式分配了本地地址和端口,现在它正在监听那些?如果是这样,我该如何检索它们是什么?
Jas*_*oco 12
调用正在运行,但由于您没有显式绑定套接字,因此操作系统或系统库会为您隐式分配端口和默认绑定(与您在connect(2)未bind(2)先调用时调用时完全相同).另外,既然您之前询问过TCP的内容,我假设您在这里谈论的是Internet套接字.
找出操作系统绑定套接字的操作系统的名称因操作系统而异,因此您必须查找特定的操作系统,但大多数操作系统都提供了一个netstat或类似的工具,您可以使用它来查询哪些应用程序正在侦听哪些端口.
正如John在评论中提到的那样,您可以使用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);
Run Code Online (Sandbox Code Playgroud)
addr 现在将包含套接字正在侦听的IP地址和端口.
| 归档时间: |
|
| 查看次数: |
3539 次 |
| 最近记录: |