2013-12-08 48 views
0

在C,我試圖連接到使用以下功能的服務器:我的connect()調用失敗了嗎?

int clientConnect() { 

//1. Set up connection address and port 
char *ipAddress = SMSA_DEFAULT_IP; 
int port = SMSA_DEFAULT_PORT; 

//1a. Set up a sockaddr_in struct as described in lecture 
struct sockaddr_in caddr; 
caddr.sin_family = AF_INET; 
caddr.sin_addr.s_addr = htonl(SMSA_DEFAULT_IP); 
caddr.sin_port = htons(port); 

//2. Create a socket 
server_socket = socket(PF_INET, SOCK_STREAM, 0); 

if(server_socket == -1) 
{ 
    logMessage(1, "There was an error creating a socket in clientConnect()"); 
    return -1; 
} 

//3. Connect 
if(connect(server_socket, (const struct sockaddr *)&caddr, sizeof(struct sockaddr)) == -1) 
{ 
    logMessage(1, "There was an error connecting in clientConnect()");\ 
    return -1; 
} 

logMessage(2, "The connection was made!"); 
return 0;} 

當這個函數被調用時,我在我的日誌There was an error connecting in clientConnect()得到一個消息。這是我第一次用C語言進行網絡編程,所以我懷疑我錯過了一些東西。

+5

檢查'errno'的值(或使用'PERROR()')如果一個系統調用(比如'連接()')失敗。 - 可能有很多原因:錯誤的IP地址,服務器沒有響應,... –

+3

這裏有道德。當出現錯誤時,請記錄*錯誤,*不僅僅是您自己設計的一些文本。除了出現問題之外,你自己的文本無法告訴你什麼。實際的錯誤可以。 – EJP

+0

@Martin R謝謝你的提示,非常有幫助 – Mike

回答

0

的最後一個參數connect應該sizeof caddr

connect(server_socket, (const struct sockaddr *)&caddr, sizeof caddr); 
+0

這當然是正確的代碼。但我認爲* struct sockaddr和struct sockaddr_in具有相同的大小(至少在OS X上),所以這不能解釋錯誤。 - 也許我錯了。 –

+0

@MartinR如果這解決了問題,它們必須與QED不同。 – EJP

+0

@MartinR沒有要求'sockaddr'和'sockaddr_in'具有相同的大小,這就是爲什麼套接字地址總是作爲一對'sockaddr *'和'socklen_t'傳遞的。 –