2017-10-01 12 views
0

지금 소켓 프로그래밍을 사용하고, 프로세스가 될 때 :왜 recv()가 멈 춥니 까? 다음

클라이언트 ------- 이름을 보내기 ------는 scanf에서 사용자 이름()을 받기 ----- ---- 서버

서버 ------- 확인 메시지 ------- 클라이언트 보내기

클라이언트 ------ 승인을 받기 -----는 scanf에서 암호를 가져옵니다() ------ 암호 전송 ---------- 서버

서버 ------- 암호 얻기

하지만 두 번째 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

당신은 하나 개의 송신 한 수신에 해당한다고 가정하고, 모든이 F를받을 수 버퍼가 제공됩니다. 반드시 그런 것은 아닙니다. 설명서를 참조하십시오. 블로킹 모드에서 수신을 보장하는 유일한 방법은 스트림 끝나 오류가 발생하지 않는 한 적어도 하나의 바이트가 전송된다는 것입니다.