C 我们在服务器中绑定的端口与netstat中绑定的端口不同

C 我们在服务器中绑定的端口与netstat中绑定的端口不同,c,sockets,network-programming,C,Sockets,Network Programming,在服务器程序中,我绑定了IP127.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 |

在服务器程序中,我绑定了IP127.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);

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

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

指定端口地址时,应注意它是一个
16位端口号,按网络字节顺序排列
(来自W.Richard Stevens'UNIX网络编程(b))。网络字节排序是一个大端方案,而您的实现似乎有一个小端方案,因此您需要切换八位字节:

ser_addr.sin_port = htons (1234);
事实上,即使字节顺序相同,您也应该这样做,因为在这种情况下,它变成了一个no操作。
htons
是您如何(引用上述同一本书)“将主机转换为网络,短整数”


(a) 这是因为数据类型中八位字节的顺序决定了值的计算方式:

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

4*256+210=1234//或使用(x它与端口设置的字节顺序有关

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

指定端口地址时,应注意它是一个
16位端口号,按网络字节顺序排列
(来自W.Richard Stevens'UNIX网络编程(b)).Network byte ordering是一个大端方案,而您的实现似乎有一个小端方案,因此您需要切换八位字节:

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


(a) 这是因为数据类型中八位字节的顺序决定了值的计算方式:

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

4*256+210=1234//或使用(x请给我们看你的代码请给我们看你的代码谢谢!我使用了inet_addr,它转换成网络的Big-Endian格式,但我完全忘记了端口。有没有像inet_addr这样的函数?@RHLK,是的,它是
htons
调用。它不需要字符串,但不需要,因为端口可能不是复杂的点添加ress.谢谢!我使用了inet_addr,它可以转换成网络的Big-Endian格式,而我完全忘记了端口。有没有像inet_addr这样的函数?@RHLK,是的,它是
htons
调用。它不需要字符串,但也不需要,因为端口可能不是复杂的点地址。