2017-05-23 101 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

我認爲這是傾聽。我怎麼知道我的服務器正在監聽? –