我编写了一个 ping 程序,将 syn 数据包发送到目标 IP 地址 1.1.1.1 端口 0。我使用了 wireshark,我看到返回的数据包带有 RST/ACK 标志。但问题是当我使用 select() 尝试读取套接字时, select()总是返回 0。所以我不知道如何调试程序。我确定我每次都重置 fd_set 读取集。有什么我错过的吗?我发现使用wireshark在0.0003秒内返回来自1.1.1.1的回复我设置的超时是1秒(1000毫秒) 这是代码
void readloop() {
....
while(nsent < 4) {
send_v4();
wait_for_reply(1000); // wait for 1 second;
}
}
int wait_for_reply(long wait_time) {
....
result = recving_time(...);
if(result < 0) // because time out
return 0;
....
}
int recving_time(...) {
......
fd_set readset;
select_again:
set timeout value to structure *to*
FD_ZERO(&readset);
FD_SET(sockfd, &readset);
readable = select(sockfd+1, &readset, NULL, NULL, &to);
#ifdef DEBUG
fprintf(stderr, "readable is %d\n",readable); // **Why readable always be 0 although packets returned.**
#endif
if(readable < 0) {
if(errno == EINTR)
goto select_again;
else {
perror("select() error");
exit(1);
}
if(readable == 0) {
return -1;
}
......
}
我不确定这里有足够的代码来理解我想说的话。如果你能帮助我,我将非常感激