在C中的socket编程功能中连接失败

时间:2017-05-23 17:41:13

标签: c sockets tcp ip

我有一个启动套接字连接的函数。我正在尝试使用名称的服务器,例如xp。 Socket()工作正常。但是当谈到连接时,我收到了一个错误。我试图获得该服务器的IP,我得到了一些随机IP。我将参数传递给connect 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.但我仍然无法连接。

1 个答案:

答案 0 :(得分:1)

perror()或大多数其他类似unix的系统调用返回错误时,使用connect()打印人类可读的错误字符串。但既然你告诉我们errno的价值,我查看了errno.h的含义,并找到了:

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

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

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

无论如何,这都表明服务器存在问题。

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

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