-1

我一直在使用代理服务器。它必须连接到另一个“监视器”程序并从该程序获取连接地址信息。该程序在已知的 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 faults 时发生错误。

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

但是将其更改为:

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

2 回答 2

0

给我的 ip 地址不是我正在使用的计算机上的 ip。我最终决定IP地址一定是问题所在。我在我的计算机上找到了 IP 地址,并让服务器程序绑定到它。我还将它作为上面包含的代码的 IP 地址而不是本地主机,它能够连接,无论服务器是在该特定 IP 地址上还是简单地连接到 INADDR_ANY。

于 2013-04-26T07:00:39.050 回答
0

尝试更换

hints.ai_flags = 0;

hints.ai_flags = AI_NUMERICHOST;

看看会发生什么。

于 2013-04-24T17:34:01.237 回答