2017-10-01 6 views
0

J'utilise la programmation socket maintenant, le processus est le suivant:Pourquoi recv() se bloque?

client ------- Obtenez le nom d'utilisateur de scanf() ------ ----- Envoyer Nom d'utilisateur ---- serveur

serveur ------- ------- Envoyer un message acquittement client

client ------ ----- Get reconnaissance Obtenez mot de passe scanf() ------ Envoyer le mot de passe ---------- Serveur

Serveur ------- Obtenir le mot de passe

Mais j'ai le serveur bloque à la seconde recv(), je l'ai googlé et la seule réponse à ce sujet est le problème de limite de lecture, mais pour le nom d'utilisateur, j'ai dit au serveur combien d'octets il devrait obtenir ... 't chiffre sur ce qui se passe ...

code client:

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); 
} 

serveur de code:

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); 

} 

Répondre

0

Vous présumez que l'un est égal à envoyer un reçu, et que tous les recevoir f maux le tampon fourni. Ce n'est pas nécessairement le cas. Voir la documentation La seule garantie de réception en mode bloquant est qu'au moins un octet est transféré, sauf si la fin du flux ou une erreur est survenue.