【发布时间】:2015-08-21 17:15:03
【问题描述】:
当我编写如下代码时,报告的对端的 ip 和端口是正确的:
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;
}
例如,我在本地机器上使用 nc 连接到它:
#nc 127.0.0.1 8080
输出是:
Connection from 127.0.0.1 port 55112
但如果我只是将它们放在另一个块中,例如“if”或“while”,程序会报告错误的 ip 和端口:
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;
}
}
示例输出:
Connection from 253.127.0.0 port 32323
我在 linux x64 上使用“gcc code.c -o code”编译它。 这很奇怪,我不知道这怎么可能。有什么想法吗?
【问题讨论】:
-
不需要使用 sockaddr_storage,立即使用 sockaddr_in。在使用 inet_ntop 之前检查该结构内的值。
-
另请阅读:stackoverflow.com/questions/20130415/… 不要使用 inet_ntop。
-
1.使用 SO_REUSEADDR:stackoverflow.com/questions/24194961/… 2. 检查来自
socket、bind、listen、accept的返回值。如果其中之一失败,您将在代码中得到垃圾。 -
@PhilipStuyck 我做了你说的问题仍然存在。 “if block”改变程序的行为似乎是不可能的。为什么在“if”中会出现问题
-
@CS。所以这不是真正的代码吗?那我就不费心调试了。