【问题标题】:Port that we bind in server is not same as with netstat我们在服务器中绑定的端口与 netstat 不同
【发布时间】:2013-11-24 10:55:11
【问题描述】:

在服务器程序中,我绑定了 IP 127.0.0.1 和端口 1234。

但是,当我使用 netstat -lntpu 来查找哪个进程正在侦听哪个端口时。我发现我的服务器程序已列出,但令人惊讶的是,端口号不是我分配的!

这就是我所指的那一行

Proto | Recv-Q | Send-Q | Local Address    |     Foreign Address  | State  | PID/Program_name 

tcp   | 0      |  0     | 127.0.0.1:53764  |       0.0.0.0:*      | LISTEN |   10545/server 

那么,如果我将套接字与 1234 绑定,为什么 netstat 会列出 53764?

我能够成功地将数据从客户端传输到服务器并返回。但这在这里看起来很奇怪!

这是绑定代码

struct sockaddr_in ser_addr

ser_addr.sin_family=AF_INET;
ser_addr.sin_port=1234;
ser_addr.sin_addr.s_addr=inet_addr("127.0.0.1");

sd=socket(AF_INET,SOCK_STREAM,0);
ret=bind(sd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
listen(sd,3);

【问题讨论】:

  • 请向我们展示您的代码

标签: c sockets network-programming


【解决方案1】:

这与端口设置的字节顺序有关。

1234 由两个八位字节{4, 210} 组成,而{210, 4} 为您提供53764(a)

指定端口地址时,您应该知道它是16-bit port number, network byte ordered(来自W. Richard Stevens' UNIX 网络编程 (b) )。网络字节排序是一个大端方案,而您的实现似乎有一个小端方案,因此您需要切换八位位组:

ser_addr.sin_port = htons (1234);

事实上,即使字节顺序相同,您也应该这样做,因为在这种情况下,它变成了无操作。 htons 是您(引用上述同一本书)“将主机转换为网络,短整数”的方式。


(a) 之所以如此,是因为数据类型中八位字节的顺序决定了值的计算方式:

  4 * 256 + 210 =  1234  // or use (x <<   8 | y) rather than 
210 * 256 +   4 = 53764  //        (x *  256 + y) if you wish

(b) 如果您要进行任何严肃的网络开发,您真的应该拥有一本书。

【讨论】:

  • 谢谢!我使用了 inet_addr ,它转换为网络的 Big Endian 格式,而我完全忘记了端口。有没有类似 inet_addr 的函数?
  • @RHLK,是的,这是htons 电话。它不需要字符串,但也不需要,因为端口可能不是复杂的点地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2011-08-21
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多