【问题标题】:connect is unsuccessful in my socket programming function in C连接在我的 C 中的套接字编程功能中不成功
【发布时间】:2017-10-23 19:24:09
【问题描述】:

我有一个启动套接字连接的函数。我正在尝试一个名称为 xp 的服务器。 Socket() 工作正常。但是在连接时,我遇到了错误。我试图获取该服务器的 IP,我得到了一些随机 IP。我将参数传递给连接 API。我在日志文件中打印这些结果。我认为错误在于connect()。我正在使用 Linux Ubuntu。这是我的 SocketInit() 程序。我无法理解那个错误。

我将 SocketInit 函数称为 SocketInit(argv[2]); argv[2] 有我的服务器名称。

short SocketInit(char *xp)
{
      if ( (local_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
        printf("socket creation is unsuccessful check in SocketInit() \n");
        sprintf(log_msg, "create socket descriptor error = %d", errno);
        LogMsg('E', log_msg);
        return(-1);
      }
      else
      {
        printf("socket connection is success\n");
      }

      pos_socket.sin_family = AF_INET;
      pos_socket.sin_port   = htons(port_no);
      pos_socket.sin_addr.s_addr = inet_addr(xp);

      if ( connect( local_socket, (struct sockaddr *) &pos_socket, sizeof(pos_socket) ) < 0 ) {
        sprintf(log_msg, "connect on socket error=%d", errno);
        printf("socket connect api is unsuccessful check in SocketInit() \n");
        LogMsg('E', log_msg);
        return(-1);
      }
      else{
        printf("connect is successful\n");
        return 0;
      }

}

如何连接到服务器。如何将地址传递给 pos_socket.sin_addr.s_addr ?有时我会收到连接错误 110 和 111。但我仍然无法连接。

【问题讨论】:

  • xp 指向的实际字符串是什么?是IP地址吗?需要解析为 IP 地址的主机名?你得到的错误是什么?请使用例如strerrorerrno 获取可打印的错误消息(errno 的值可能因系统而异,请记住,在使用任何其他可能设置它的函数之前,您必须检查errno 的值)。
  • 使用perror 了解它是什么错误。
  • 是的 xp 是一个服务器,它的 IP 地址是 10.254.xx.xx。我试图在我的实际程序中使用 gethostbyname 打印我的服务器 xp 的 IP 地址。它显示的 IP 完全相同。
  • 所以如果你像SocketInit("10.254.x.x")这样调用你的函数,它仍然不起作用?您是否尝试过将errno 打印为字符串?
  • 是的,我试过了。结果相同。 @Someprogrammerdude

标签: c sockets tcp ip


【解决方案1】:

connect() 或大多数其他类unix 系统调用返回错误时,使用perror() 打印人类可读的错误字符串。但是既然你告诉了我们errno的值,我就去errno.h找意思,发现:

#define ETIMEDOUT   110 /* Connection timed out */
#define ECONNREFUSED    111 /* Connection refused */

(顺便说一句,你不能指望 errno 从一个 unix 到另一个是相同的,这就是为什么在检查特定错误时需要使用这些定义的原因。永远不要将数字 errno 值硬编码到你的代码中。它对我有用这次,但不一定每次都这样)。

ECONNREFUSED 表示有一台机器正在监听指定的 IP 地址,但没有进程正在监听指定端口号上的连接。远程进程没有运行,它没有正确绑定或接受连接,或者它可能被某种防火墙阻止。

无论如何,这表明服务器有问题。

因此,请检查以确保您的远程进程实际上已准备好接受连接。您可以使用telnetnetcat 作为测试客户端,看看其他已知可以工作的客户端程序是否能够连接到您的服务器。

另外,我注意到您的变量 port_no 没有声明,所以我们无法知道您尝试连接到哪个端口.. 但请确保该变量的类型正确且具有正确的值对于您尝试连接的服务。如果 port_no 未指定正确的端口,您将得到相同类型的错误。

【讨论】:

  • 我知道 tcp 套接字错误。问题是为什么我没有连接到我的服务器 xp?
  • 阅读我的解释.. 你确定服务器进程正在监听那个端口吗?您尝试连接的服务类型是什么,端口号是什么。最后但并非最不重要的一点是服务器的操作系统是什么?
  • 我认为它在听。我怎么知道我的服务器正在监听?
  • 我告诉过你.. 使用 telnet。你想连接什么?
  • @emb-pro 它没有在听。这就是 ECONNREFUSED 的意思。
猜你喜欢
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
  • 2021-06-24
相关资源
最近更新 更多