gpt4 book ai didi

c - 识别 connect( ) 的问题

转载 作者:行者123 更新时间:2023-11-30 19:48:55 25 4
gpt4 key购买 nike

我一直在代理服务器上工作。它必须连接到另一个“监视”程序并从该程序获取连接地址信息。该程序在已知的 IP 和端口上运行。如果我使用以下连接它工作正常:

struct hostent *serv;
int sockfd;
struct sockaddr_in serv_addr;

serv = gethostbyname("localhost");
sockfd = socket(AF)INET, SOCK_STREAM, 0);
if (sockfd < 0)
/* Error handling */
bzero((char *) &serv_addr, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *) server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portno); // portno is an int holding the port number
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
/* error handling */

但是我想使用确切的IP地址而不是本地主机,它们可能并不总是在同一台机器上,并且gethostbyname()已经过时了。我尝试像这样使用 getaddrinfo() :

struct addrinfo hints, *server;
int sockfd, i;
char *host = "192.168.2.4";
char *port = "4044";

memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = 0;
hints.ai_protocol = IPPROTO_TCP; // have also tried it with 0
i = getaddrinfo(host, port, &hints, &server);
if (i != 0)
/* Error handling */
sockfd = socket(server->ai_family, server->ai_socktype, server->ai_protocol);
freeaddrinfo (server); // have also tried without this line
if (sockfd < 0)
/* Error handling */
printf("Attempting to connect\n");
if (connect(sockfd, server->ai_addr, server->ai_addrlen) != -1)
/* Error handling */
printf("Connection attempt complete\n");

第二次尝试在 connect() 命令上挂起很长时间,最终错误返回。我已经浏览了几个地方的示例,并在 stackoverflow 上搜索了以前的问题,但找不到问题,或者为什么一个有效而另一个无效。我认为这与 server->ai_addr 值有关,但尚未能够验证它。

任何帮助将不胜感激,我做错了什么明显的事情吗?我不知道还能在哪里寻找更多想法来检查。

编辑更新:我已经想出了一个问题。在 if (connect (/* */) != -1) 行中它应该是 != 0。我正在查看的示例之一使用了 bind() 语句。如果我将本地主机地址与第二个地址一起使用,它可能会适用于该更改。但是我仍然无法连接到特定的 IP 地址节点。我开始怀疑给我的 IP 地址不是该计算机可以接收网络流量的地址。但我不知道如何检查。我将查看是否可以通过使用特定 IP 地址找出有关错误的更多信息,并使用该信息再次进行编辑。

编辑更新:我添加了 #include 并尝试在系统调用返回后打印出错误代码。我还打印了返回单。它返回 -1,根据我发现的文档,这仅意味着当我尝试打印 errno it seg 错误时发生错误。

fprintf(stderr, "Error Code %s\n", errno); // seg faults

但是将其更改为:

fprintf(stderr, "Error Code %d\n", errno); // returns Error Code 60

最佳答案

尝试更换

hints.ai_flags = 0;

hints.ai_flags = AI_NUMERICHOST;

看看会发生什么。

关于c - 识别 connect( ) 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16198005/

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