2017-05-23 72 views
0

我有一个启动套接字连接的函数。我正在尝试使用名称的服务器让我们说XP。套接字()工作正常。但是当连接时,我收到一个错误。我试图获得该服务器的IP,我得到了一些随机IP。我将参数传递给了连接API。我将这些结果打印在日志文件中。我认为错误在于connect()。我正在研究Linux Ubuntu。这是我的SocketInit()程序。我无法得到这个错误。连接在我的套接字编程函数中失败C

我将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

'xp'指向的实际字符串是什么?它是一个IP地址吗?需要解析为IP地址的主机名?你得到的错误是什么?请使用['strerror'](http://man7.org/linux/man-pages/man3/strerror.3.html)从'errno'获得可打印的错误信息(errno的值可能因系统而异,并且记住,在使用可能设置它的任何其他函数之前,您必须检查“errno”的值)。 –

+0

使用'perror'来了解它是什么错误。 –

+0

是的xp是一个服务器,它有一个IP地址10.254.xx.xx.我试图在我的实际程序中使用gethostbyname打印我的服务器x​​p的ip地址。它显示完全相同的IP。 –

回答

1

使用perror()connect()或大多数其他类似unix的系统调用返回错误时,打印可读的错误字符串。但因为你告诉我们errno的值,我看着errno.h的意义,并发现:

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

(顺便说一句,为什么你需要你不能错误号伯爵的是相同的,从一个UNIX到另一个是在检查特定错误时使用这些定义,不要将数字错误值写入你的代码中,这次对我来说是成功的,但它不一定每次都是这样)。

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

无论如何,这指出服务器有问题。

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

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

+0

我知道tcp套接字错误。问题是为什么我没有连接到我的服务器XP? –

+0

阅读我的解释..你确定服务器进程正在侦听该端口吗?您尝试连接的服务类型以及端口号是什么?最后但并非最不重要的是服务器的操作系统是什么? –

+0

我认为这是倾听。我怎么知道我的服务器正在监听? –