2017-10-07 65 views
0
int connect_to_host(char* server_ip, char* server_port) 
{ 
    printf("%s\n", "in connect to host"); 
    printf("server_ip in connect_to_host: %s\n", server_ip); 
    printf("server_port in connect_to_host: %s\n", server_port); 
    struct sockaddr_in remote_server_addr; 
    int fdsocket, port; 
    uint16_t port = atoi(server_port); 
    socklen_t len = sizeof(remote_server_addr); 
    fdsocket = socket(AF_INET, SOCK_STREAM, 0); 
    if(fdsocket < 0) { 
     printf("%s\n", "socket error"); 
     return -1; 
    } 

    memset(&remote_server_addr, 0, sizeof(remote_server_addr)); 

    remote_server_addr.sin_family = AF_INET; 
    remote_server_addr.sin_addr.s_addr = inet_addr(server_ip); 
    //inet_pton(AF_INET, server_ip, &remote_server_addr.sin_addr); 
    remote_server_addr.sin_port = htons(port); 
    printf("remote server port after htons: %d\n", remote_server_addr.sin_port); 

    if(connect(fdsocket, (struct sockaddr*)&remote_server_addr, &len) < 0) { 
     printf("%s\n", "connect error"); 
     return -1; 
    } 

    return fdsocket; 
} 

此塊的輸出:連接失敗每次(也越來越非法指令:4)

in connect to host 
server_ip in connect_to_host: 192.168.1.179 
server_port in connect_to_host: 49200 
remote server port after htons: 12480 
connect error 
[LOGIN:ERROR] 
[LOGIN:END] 
Illegal instruction: 4 

服務器初始化端口49200,它的IP是相同的客戶端(在本地機器上測試) - 192.168.1.179。

我不明白爲什麼連接失敗。原因我在一個不同的函數中以相同的方式執行connect(),只是在這種情況下連接是UDP,並且工作正常。是否因爲我試圖連接到相同的IP?

我對此很新。讓我知道你是否需要更多的代碼部分。

+1

做perror而不是printf - 你會得到一個錯誤的解釋 – pm100

+0

好吧。感謝那! 我收到文件名太長的錯誤。 這是什麼意思? – Manic

+0

@Myst'htons()'在那裏是正確的。請參閱* man *頁面。你有沒有其他想法的理由? – EJP

回答

2
if(connect(fdsocket, (struct sockaddr*)&remote_server_addr, &len) < 0) { 
    printf("%s\n", "connect error"); 
    return -1; 
} 

問題在這裏。 connect()的第三個參數是addrlen_t,而不是指針。它應該是:

if(connect(fdsocket, (struct sockaddr*)&remote_server_addr, len) < 0) { 
    perror("connect error"); 
    return -1; 
} 

打印自己的錯誤消息的一個errnoperror()strerror()給你是完全是浪費時間,而不是。不要這樣做。每次任何系統調用失敗,您必須打印或記錄或返回實際錯誤。

Obviosuly的「非法指令」的問題不能從這個代碼的到來,爲您打印更多的消息就退出了。

+0

好的。這有效,有點。現在我得到'拒絕連接'。似乎服務器從不執行監聽部分,爲什麼它超出了我的範圍。 :( – Manic

+0

我建議你*調試*它,開始在我的第二個,最後一個段落的建議。 – EJP

+0

是的。這樣做。非常感謝! 雖然,有這個東西用gdb和Mac,我不知道是否有是適用於MacOS 10.13修復,但我沒有離開這個分配足夠的時間來試圖解決這個問題。因此,試圖用每行後打印語句來調試。 哦。這種指派,多客戶端聊天應用是我第一次在C.編碼:P – Manic