clinuxsocketsportsockaddr-in

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.


Solution

  • 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