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