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