user96649 user96649 - 1 year ago 72
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, I get a connection refused message :

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

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

tcp 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 Source

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
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download