sockaddr.sin_port = 1337 与 "real" 打开的端口不匹配

sockaddr.sin_port = 1337 doesn't match the "real" opened port

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

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);

然而,当我尝试连接到 127.0.0.1:1337 时,我收到一条连接被拒绝的消息:

(UNKNOWN) [127.0.0.1] 1337 (?) : Connection refused

然而,一个简单的 netstat -tcpan 告诉我确实打开了一个端口:

tcp 0 0 0.0.0.0:14597 0.0.0.0:* LISTEN

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

我在这里错过了什么?为什么1337端口没有打开?好像也是免费的。

listen(serv, 0);

listen 的第二个参数是 backlog 如果我们查看 documentation for listen :

The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow. If a connection request arrives when the queue is full, the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a later reattempt at connection succeeds.

ECONNREFUSED 正是您收到的错误消息,因为积压已满(它可以容纳 0 个连接,所以它总是满的)。 您应该将该数字至少增加到 1,但更高的数量可能更好 listen(serv, 10);.

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

in_sock.sin_port = htons(1337);

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

 1337 = 0x0539
14597 = 0x3905