user96649 user96649 - 1 month ago 8
C Question

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

I am trying to make a very simple server that accept a connection.

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


However when trying to connect to 127.0.0.1:1337, I get a connection refused message :


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


However a simple
netstat -tcpan
shows me that a port is indeed opened :


tcp 0 0 0.0.0.0:14597 0.0.0.0:* LISTEN


If I set sin_port with much higher ports it seems to work properly though.

What am I missing here ? Why isn't the 1337 port opened ? It seems to be free too.

Answer

The port number field in struct sockaddr_in is stored in network byte order. This means that you must use htons() when storing a value to it:

in_sock.sin_port = htons(1337);

Otherwise, the port number will be left byte-swapped. Which is exactly what has happened here:

 1337 = 0x0539
14597 = 0x3905
Comments