When I write a code like below, the reported ip and port of the peer is correct:
int main(){
int server = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(server,(struct sockaddr *)&addr,sizeof addr);
listen(server,5);
struct sockaddr_storage inc_adrs;
socklen_t inc_len;
int client = accept(server, (struct sockaddr *) &inc_adrs,&inc_len);
struct sockaddr_in *inc_adr = (struct sockaddr_in *) &inc_adrs;
char ip [INET_ADDRSTRLEN];
inet_ntop(AF_INET,&(inc_adr->sin_addr),ip,INET_ADDRSTRLEN);
printf("Connection from %s port %d\n",ip,ntohs(inc_adr->sin_port));
return 0;
}
And for example I connect to it using nc on my local machine :
#nc 127.0.0.1 8080
And the ouput is:
Connection from 127.0.0.1 port 55112
But if I just put them in another block like "if" or "while" the program reports wrong ip and port:
int main(){
if (1){
int server = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(server,(struct sockaddr *)&addr,sizeof addr);
listen(server,5);
struct sockaddr_storage inc_adrs;
socklen_t inc_len;
int client = accept(server, (struct sockaddr *) &inc_adrs,&inc_len);
struct sockaddr_in *inc_adr = (struct sockaddr_in *) &inc_adrs;
char ip [INET_ADDRSTRLEN];
inet_ntop(AF_INET,&(inc_adr->sin_addr),ip,INET_ADDRSTRLEN);
printf("Connection from %s port %d\n",ip,ntohs(inc_adr->sin_port));
return 0;
}
}
Sample output:
Connection from 253.127.0.0 port 32323
I compile it with "gcc code.c -o code" on linux x64. It is very strange and I don't know how it is possible. Any idea?