我正在尝试制作一个接受连接的非常简单的服务器。
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时,我收到了一条拒绝连接的消息:
(未知([120.0.1]1337(?(:连接被拒绝
然而,一个简单的netstat -tcpan
告诉我,一个端口确实打开了:
tcp 0 0.0.0.0:14597 0.0.0.0:*列出
如果我用更高的端口设置sin_port,它似乎可以正常工作。
我在这里错过了什么?为什么1337端口没有打开?它似乎也是免费的。
struct sockaddr_in
中的端口号字段按网络字节顺序存储。这意味着在存储值时必须使用htons()
:
in_sock.sin_port = htons(1337);
否则,端口号将被左字节交换。这正是这里发生的事情:
1337 = 0x0539
14597 = 0x3905
listen(serv, 0);
listen
的第二个参数是backlog
,如果我们查看有关侦听的文档:
backlog参数定义的队列的最大长度sockfd的挂起连接可能会增加。如果连接请求当队列已满时到达,客户端可能会收到错误ECONNREFUSED的指示,或者,如果底层协议支持重新传输时,该请求可能会被忽略,以便以后重新尝试连接成功。
ECONNREFUSED
正是您收到的错误消息,因为积压工作已满(它可以容纳0个连接,因此总是满的(。您应该将该数字增加到至少1,但listen(serv, 10);
的数量越大可能越好。