2016-04-14 8 views
0

私はこのコードを持っていますが、接続できるのは同じPC上の仮想マシンからクライアントを実行しますが、LOGINメッセージは表示されません。tcpソケットサーバーは送信しません

flags引数が正しく設定されているかどうか確信できません。

、変更する必要が
static const char *LOGIN = "LOGIN\n"; 

int main() 
{ 
    int s = socket(AF_INET, SOCK_STREAM, 0); 

    struct sockaddr_in addr; 
    socklen_t addrlen = sizeof(addr); 

    //initialize structure 
    bzero(&addr, addrlen); 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(6666); 
    addr.sin_addr.s_addr = htonl(INADDR_ANY); 

    bind(s, (struct sockaddr *)&addr, addrlen); 
    listen(s, 1); 

    struct sockaddr_in client_addr; 
    socklen_t client_addrlen = sizeof(client_addr); 
    int c = accept(s, (struct sockaddr *)&client_addr, &client_addrlen); 

    char *msg = new char[15]; 

     //print client address 
     char * buf = new char[16]; 
     inet_ntop(AF_INET, &(client_addr.sin_addr.s_addr), buf, 16); 
     cout << "Client connected: " << buf << endl; 
     cout << "---------------------" << endl; 

     send(c, LOGIN, sizeof(LOGIN), 0); 

    close(c); 
    close(s); 
    return 0; 
} 
+0

まず、エラーをチェックするのがよいでしょう。これらのシステムコールはすべて失敗して(-1という値を返して)返すことができます。その場合は、['errno'](http://man7.org/linux/man-pages/man3/errno)をチェックしてください。 3.html)何がうまくいかなかったかを見てください。たとえば、 ['perror'](http://man7.org/linux/man-pages/man3/perror.3.html)を使ってメッセージを表示するか、[' strerror'](http://man7.org/ linux/man-pages/man3/strerror.3.html)を使用して、エラーコードから印刷可能な文字列を取得します。 –

答えて

3

static const char *LOGIN = "LOGIN\n"; 

をする:元のコールが32であれば(4を通過した

send(c, LOGIN, sizeof(LOGIN)-1, 0); 

static const char LOGIN[] = "LOGIN\n"; 

と送信呼び出しに-bitシステム)sizeofがapplしていたため文字列ではなくポインターで指定します。固定バージョンの-1は、文字列から終了する'0'を減算します。

+2

代わりに、代わりに 'strlen'を使用してください。 –

関連する問題