2017-10-01 11 views
0

私は今、ソケットプログラミングを使用しています以下のように、プロセスは次のとおりです。なぜrecv()がハングするのですか?

クライアント-------(scanf関数からユーザ名を取得します)------ ユーザ名を送信します----- ----サーバー

サーバー------- -------確認メッセージクライアントを送る

クライアント------承認を取得----- scanf関数からパスワードを取得します()------パスワードを送信----------サーバー

サーバー-------パスワードを取得

しかし、私は2番目のrecv()でサーバーがハングしてしまいました。それについての唯一の答えは読み取り境界の問題ですが、ユーザー名については、 '何についてのtフィギュア' が起こって...

コードクライアント:

printf("Please enter the username: "); 

    scanf("%s", username); 

    //send username 

    datalen = strlen(username); 

    temp = htonl(datalen); 

    send(simpleSocket, (char*)&temp, sizeof(datalen),0); 

    bytes_sent = send(simpleSocket, (char*)&username, datalen,0); 

    //waiting acknowledge 
    bytes_recv = recv(simpleSocket, (char*)&acknowledge,sizeof(acknowledge), 0);  

    if(bytes_recv > 0){ 
     printf("Got Acknowledge!\n"); 
    } 
    else{ 
     printf("Didn't Get Acknowledge!\n"); 
    } 

    //if get acknowledge, get password 
    if(bytes_recv > 0){ 

    printf("Please enter the password: ");   
    scanf("%s", password); 

    //send password 
    datalen = strlen(password); 
    temp = htonl(datalen); 
    bytes_sent = send(simpleSocket, (char*)&temp, sizeof(datalen),0); 

    bytes_sent = send(simpleSocket, (char*)&password, datalen, 0); 
    printf("Bytes_sent(password): %d\n", bytes_sent); 
} 

コード・サーバー:

int buflen = 0; 

bytes_recv = recv(simpleChildSocket, (char*)&buflen, sizeof(int), 0); 

buflen = ntohl(buflen); 

//printf("%d\n", buflen); 

bytes_recv = recv(simpleChildSocket, username, buflen, 0); 

if(bytes_recv > 0){ 

    printf("Sent Acknowledge!\n"); 
    char acknowledge[256] = "Have Gotten Username!"; 
    bytes_sent = send(simpleChildSocket, acknowledge,strlen(acknowledge),0); 

    index = CheckUsername(username); 
    printf("Index at: %d\n", index); 

} 

else{ 
    printf("Didn't receive username!\n"); 
    close(simpleChildSocket); 
} 



//read password 

bytes_recv = recv(simpleChildSocket, (char*)&buflen, sizeof(int), 0); 

buflen = ntohl(buflen); 

bytes_recv = recv(simpleSocket, password, buflen, 0); 

if(bytes_recv > 0){ 

    printf("Bytes_recv(password): %d\n", bytes_recv); 

    if(password == PASSWORD[index]){ 

     printf("Match Success!\n"); 

    } 

} 

else{ 

    printf("Didn't Get Password!"); 

    close(simpleChildSocket); 

} 

答えて

0

あなたは1つの送信は、1が受信等しいと仮定されており、すべてのは、Fを受けること提供されたバッファには問題があります。それは必ずしもそうではありません。ドキュメントを参照してください。ブロッキングモードでの受信での唯一の保証は、ストリームの終わりまたはエラーが発生しない限り、少なくとも1バイトが転送されることです。

関連する問題