2009-10-06 144 views
0

我的服務器已啓動並運行(通過telnet連接,因此我知道它的功能),但我的客戶似乎無法建立連接。我有一種感覺,它與我填寫sockaddr_in serverAddr結構的方式有關。客戶端在使用套接字連接到服務器時遇到問題?

任何人都可以請幫忙嗎?謝謝。

int clientSocket; 
char hostname[256]; 
struct sockaddr_in serverAddr; 
struct hostent *host; 
socklen_t theirAddrSize; 

gethostname(hostname, sizeof(hostname)); 
host = gethostbyname(hostname); 

memset(&serverAddr, 0, sizeof(serverAddr)); 
serverAddr.sin_family = AF_INET; 
serverAddr.sin_addr.s_addr = inet_addr(host->h_name); 
serverAddr.sin_port = htons(30000); 

if (clientSocket = socket(AF_INET, SOCK_STREAM , 0) == -1) { 
    cerr << "socket failed ; exiting..." << endl; 
    exit(1); 
} 

if (connect(clientSocket , (struct sockaddr *) &serverAddr , sizeof(serverAddr)) == -1) { 
    cerr << "connect failed ; exiting..." << endl; 
    exit(1); 
} 

連接總是返回-1。

+0

是否檢查inet_addr將返回正確的IP地址? –

+1

什麼是主機 - > h_name?顯示對套接字和連接的呼叫。請提供更多的代碼。 – jmucchiello

+0

主機是hostent類型的,h_name返回包含本地ip的字符串。 – VeePee

回答

3

這是行不通的嗎?

 memcpy(&serverAddr.sin_addr, 
      host->h_addr, 
      sizeof(serverAddr.sin_addr)); 
+0

謝謝你,你是對的。 – VeePee

+0

本例中我遵循gethostbyname()調用附近的流程:http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=/rzab6/rzab6xconoclient.htm –

1

據我所見,您在此發佈的代碼沒有任何問題。這與我多年來一直在寫的套接字客戶端代碼非常相似。所以這個問題要麼在代碼的其他地方,要麼在數據中。

啊 - 你編輯了代碼...並添加了一些評論。好的,inet_addr的返回值是-1(4294967295 == 0xFFFFFFFF == -1 == INADDR_NONE),所以它似乎不喜歡你傳遞它的東西。

您需要通過調試器運行代碼,專注於調用gethostname和gethostbyname。我假設這是測試代碼,因爲你連接到你運行的同一臺機器上。

4

而不是inet_addr(host->h_name),使用host->h_addr_list[0]

+0

是的,'inet_addr '用於將類似「127.0.0.1」的字符串轉換爲'struct in_addr',但'gethostbyname'已經在'h_addr_list'數組中生成'struct in_addr'。 – caf

1

我確實需要的memcpy但很多這種頭痛從一個非常愚蠢的語法錯誤朵朵:

if (clientSocket = socket(AF_INET, SOCK_STREAM , 0) == -1) 

我有它比較-1之前包裹在括號中的分配。

if ((clientSocket = socket(AF_INET, SOCK_STREAM , 0)) == -1) 

爾加,你住你學習:)

+0

你也應該*做* Ewan Todd描述的'memcpy',而不是調用'inet_addr'。 – caf

相關問題