【发布时间】:2014-01-25 09:23:08
【问题描述】:
当客户端调用 connect() 函数时,有没有办法以编程方式找到分配给客户端的端口。
getsockname 在服务器中实现。但是客户端应该使用什么?
【问题讨论】:
标签: c sockets network-programming
当客户端调用 connect() 函数时,有没有办法以编程方式找到分配给客户端的端口。
getsockname 在服务器中实现。但是客户端应该使用什么?
【问题讨论】:
标签: c sockets network-programming
connect() 隐式调用bind() 为套接字分配一个名称,如果您自己没有这样做的话。 connect() 调用成功后,您可以在套接字上使用getsockname() 来检索端口。
当您在调用bind()(端口号等于0)时让操作系统为您选择端口并且您想知道哪个端口分配给套接字时,它也很有用。
【讨论】:
您可以使用getpeername() 获取对等方使用的端口号,如以下代码片段所示,适用于 IPv4:
int s = ... // socket number
struct sockaddr_in sa;
socklen_t len = sizeof sa;
if (getpeername(s, (struct sockaddr *)&sa, &len) < 0)
perror("getpeername()");
else
printf("port %d\n", ntohs(sa.sin_port));
此外,在服务器端,您调用accept(),accept() 本身将返回一个填充的sa,它提供对等方的端口。
IPv6 类似:参见例如http://beej.us/guide/bgnet/output/html/multipage/getpeernameman.html。
【讨论】: