2012-02-04 7 views
1

Cでソケットライブラリを調べようとしていますが、recvを使用してメッセージを読む際に問題が発生しています。サーバがメッセージを受け取ったとき、送信されたメッセージやバッファサイズ(> = 8である限り)にかかわらず、常に8文字を読み込むようです。Recvは一度に8文字しか取得できません

これに加えて、メッセージを連続して送信すると、最初のメッセージだけが通過し、リセット時間があり、ソケットが正しく閉じられないようになります。ここで

は私のサーバーのコードは、これまでのところです:

void main(void) { 
    printf("Starting Server...\n"); 
    int sock = socket(AF_INET, SOCK_STREAM, 0); 

    struct sockaddr_in server, client; 

    server.sin_family = AF_INET; 
    server.sin_port = htons(3030); 
    server.sin_addr.s_addr = htonl(INADDR_ANY); 

    bind(sock, (const struct sockaddr*)&server, sizeof(server)); 
    listen(sock, 5); 

    while (1) { 
    int cli_len = sizeof(client); 
    int client_socket = accept(sock, (struct sockaddr*)&client, &cli_len); 
    conn_made(client_socket); 
    } 
} 

int conn_made(int client) { 
    printf("Connection Made...\n"); 
    char *buff = malloc(1024); 
    recv(client, buff, 1024, 0); 

    int i = 0; 
    for (i = 0; i < sizeof(buff); i++) { 
    printf("%d byte: %d\n", i, buff[i]); 
    } 
} 

答えて

4
for (i = 0; i < sizeof(buff); i++) { 
    printf("%d byte: %d\n", i, buff[i]); 
} 

sizeofは完全に間違っています。マシン上のポインタのサイズを取得します(そのサイズは一定です)。 受け取ったバイト数をにしてから印刷してください。

これを試してみてください:

ssize_t sz; 
sz = recv(client, buff, 1024, 0); 
if (sz < 0) { 
    perror("recv"); 
    return -1; 
} 

for (i = 0; i < sz; i++) 
    printf("%d byte: %d\n", i, buff[i]); 
+0

を次のように私は私のコードを作った(私は私に、恥を知っている!)秒間の誤差を無視: 'ssize_tのmessage_length =のrecv(クライアント、バフ、1024、0 ); ... (i = 0; i

+0

私のせいで、この解決策は実際にはうまくいきました。問題はクライアント側にありました。本当にありがとう! –

関連する問題