3

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

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 时,我收到一条连接被拒绝的消息:

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

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

tcp 0 0 0.0.0.0:14597 0.0.0.0:* 听

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

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

4

2 回答 2

8

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

in_sock.sin_port = htons(1337);

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

 1337 = 0x0539
14597 = 0x3905
于 2016-10-13T07:41:13.123 回答
2
listen(serv, 0);

的第二个参数listenbacklog,如果我们查看listen 的文档

backlog 参数定义了 sockfd 的挂起连接队列可以增长到的最大长度。如果队列已满时连接请求到达,客户端可能会收到带有 ECONNREFUSED 指示的错误,或者,如果底层协议支持重传,则可能会忽略该请求,以便稍后重新尝试连接成功。

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

于 2016-10-13T07:29:53.947 回答