我已经阅读了许多关于使用 C 联网的示例,但我被困住了。我可以看到带有 SYN 标志的 TCP 数据包在网络上(使用 wireshark),但接收端(我已经设置了一个虚拟机用于测试目的)什么都没有发回,甚至 RST 也没有。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <strings.h>
int establish_tcp(int port) {
char *ip = "10.0.2.15"; /* Virtual Machine */
struct sockaddr_in sockaddrin;
struct hostent *host;
int sock;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == -1) {
fprintf(stderr, "Socket Error\n");
exit(1);
}
sockaddrin.sin_family = AF_INET;
host = gethostbyname(ip);
if(host == NULL) {
fprintf(stderr, "%s unknown host.\n", ip);
exit(2);
}
/* copies the internet address into the struct */
bcopy(host->h_addr, &sockaddrin.sin_addr, host->h_length);
/* specify port (used by TCP a layer above */
sockaddrin.sin_port = port;
/* try to connect */
return connect(sock, (struct sockaddr*) &sockaddrin, sizeof(struct sockaddr_in));
}
int main(void) {
printf("status: %i\n", establish_tcp(80));
return 0;
}
数据包超时并返回 -1 作为状态码需要一段时间。目标机器不发送回复怎么会发生?我忽略了什么?
我想我已经发现这不是设置问题。我正在运行 Ubuntu 12.04。虚拟机是 Debian Wheezy,我用ifconfig
. 我试过机器是否可以通过telnet
.
为了避免可能与 Virtual Box 有关的问题,我尝试将 IP 替换为 Google 的 IP,得到相同的结果。