用connect()识别问题

时间:2013-04-24 17:03:41

标签: c network-programming

我一直在研究代理服务器。它必须连接到另一个“监视器”程序并从该程序获取连接地址信息。该程序在已知的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-&gt; ai_addr值有关,但尚未验证它。

任何帮助都会受到赞赏,我做的事情显然是错误的吗?我不知道在哪里可以找到更多想法来检查。

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

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

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

然而将其更改为:

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

2 个答案:

答案 0 :(得分:0)

尝试替换

hints.ai_flags = 0;

hints.ai_flags = AI_NUMERICHOST;

看看会发生什么。

答案 1 :(得分:0)

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