2017-10-07 3 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)

サーバーは、ポート49200を使用して初期化し、それがIPがクライアントと同じであるのですされ
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 

(ローカルマシン上でのテスト) - 192.168.1.179。

私は接続が失敗している理由を理解できません。私は別の関数で同じ方法でconnect()を実行しているので、その場合は接続がUDPであり、正常に動作します。私は同じIPに接続しようとしているからですか?

私はこれにかなり新しいです。コードの他の部分が必要な場合はお知らせください。

+1

printfの代わりにperrorを実行すると、エラーの説明が表示されます。 – 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()の3番目の引数は、ポインタではなくaddrlen_tです。それは次のようになります。

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

独自のエラーメッセージerrnoまたはperror()またはstrerror()は、あなたが完全な時間の無駄である与えてくれるものの代わりにを印刷します。それをしないでください。 システムコールが失敗するたびに、実際のエラーを出力するか、ログに記録するか返す必要があります。

また、終了後にさらにメッセージを印刷したため、このコードから「不正な命令」の問題が発生することはありません。

+0

それはうまくいった。今、私は 'Connection refused'を取得しています。サーバーがリスニング・パートを実行することはないと思われます。なぜなら、それは私にとっては理由がありません。 : – Manic

+0

私は2番目の最後の段落の示唆から始めて、デバッグすることをお勧めします。 – EJP

+0

はい、そうです。ありがとうございました! gdbとMacでこの問題がありますが、 MacOS 10.13の修正ですが、私はこの割り当てを試して修正するのに十分な時間がありません。したがって、各行の後にprintステートメントでデバッグしようとしています。 ああ。この割り当て、マルチクライアントチャットアプリ私がCでコーディングするのは初めてです:P – Manic

関連する問題