繁体   English   中英

在我的C套接字编程函数中,connect不成功

[英]connect is unsuccessful in my socket programming function in C

我有一个启动套接字连接的功能。 我正在尝试使用名称叫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。但是仍然无法连接。

connect()或大多数其他类似Unix的系统调用返回错误时,请使用perror()打印人类可读的错误字符串。 但是由于您告诉我们errno的值,所以我在errno.h查找了含义,然后发现:

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

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

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

无论如何,这都指向服务器的问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM