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

时间:2016-10-13 07:25:34

标签: c linux sockets 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);

但是,当尝试连接到127.0.0.1:1337时,我收到连接被拒绝消息:

  

(UNKNOWN)[127.0.0.1] 1337(?):拒绝连接

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

  

tcp 0 0 0.0.0.0:14597 0.0.0.0:* LISTEN

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

我在这里缺少什么?为什么不打开1337端口?它似乎也是免费的。

2 个答案:

答案 0 :(得分:4)

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

in_sock.sin_port = htons(1337);

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

 1337 = 0x0539
14597 = 0x3905

答案 1 :(得分:1)

listen(serv, 0);

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

  

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

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