gpt4 book ai didi

c - TCP:建立TCP连接

转载 作者:可可西里 更新时间:2023-11-01 02:45:34 24 4
gpt4 key购买 nike

我已经阅读了很多关于使用 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 检查它的 IP。我试过机器是否可以通过 telnet 访问。
为了避免可能与 Virtual Box 相关的问题,我尝试将 IP 替换为 Google 的 IP,结果相同。

最佳答案

最有可能的问题是:

sockaddrin.sin_port = port;

端口号必须采用网络字节顺序,这与 x86 和 x86_64 机器中的 native 字节顺序不同。

更改为:

sockaddrin.sin_port = htons(port);

关于c - TCP:建立TCP连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13515599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com