sockaddr.sin_port = 1337与打开的“真实”端口不匹配

use*_*649 0 c sockets linux port sockaddr-in

我正在尝试制作一个非常简单的接受连接的服务器。

int sock, serv;
struct sockaddr_in in_sock;
serv = socket(AF_INET, SOCK_STREAM, 0);
in_sock.sin_addr.s_addr = 0;
in_sock.sin_port = 1337;
in_sock.sin_family = AF_INET;
bind(serv, (struct sockaddr *)&in_sock, sizeof(in_sock)); 
listen(serv, 0);
client = accept(serv, 0, 0);
Run Code Online (Sandbox Code Playgroud)

但是,当尝试连接到127.0.0.1:1337时,出现连接拒绝消息:

(未知)[127.0.0.1] 1337(?):连接被拒绝

但是一个简单的netstat -tcpan例子告诉我确实打开了一个端口:

tcp 0 0 0.0.0.0:14597 0.0.0.0:*听

如果我将sin_port设置为更高的端口,它似乎可以正常工作。

我在这里想念什么?为什么未打开1337端口?它似乎也是免费的。

dus*_*uff 5

中的端口号字段struct sockaddr_in以网络字节顺序存储。这意味着htons()在存储值时必须使用:

in_sock.sin_port = htons(1337);
Run Code Online (Sandbox Code Playgroud)

否则,将保留端口号的字节交换。这正是这里发生的情况:

 1337 = 0x0539
14597 = 0x3905
Run Code Online (Sandbox Code Playgroud)