Nonblocking recv 일 경우 예외처리 Programming

요약 : nonblocking 방식일 경우, 
1) recv 결과값이 0이면 소켓이 죽었으므로 처리
2) recv 값이 양수면 성공으로 인식하되 다 못읽은 바이트가 있는지 체크해서 기억해두기
3) recv 값이 음수면 에러처리 하되, nonblocking 일때 뜰 수 있는 에러 + SIGINTR은 keep going

nonblocking은 데이터를 예상한 양보다 적게 받을 수도 있다.

( recv()를 썼을때, 내가 파라미터로 넣었던 recvlen과 리턴값으로 나온 result가 서로 다를 수 있는 것이다.)

 

내가 원하는 데이터보다 덜 읽거나 아예 못 읽더라도 일단 리턴하는것이 nonblocking의 방침이다.

그러므로 이런 경우 예외처리를 해줘야 한다

못읽은 데이터 크기를 기억했다가, 다음번에 내가 원하는 만큼 다시 읽어들여야 한다.

 

 

코드로 예를 들면

 

 

int ret = recv(socket, &buf,wantRecvSize, flag);

 

if(ret == -1) 

 // Error Handling; 

}

else if (ret == 0) 

// this socket is dead. close this socket

 }

else // 여기서부터 뭔가 메세지를 성공적으로 수신했다는 건데.

{

           if(ret< wantrecvsize) // 메시지를 일단 받긴했는데, 유저가 원하는 size만큼못받은거

           {

                     return ret; // 받은 사이즈를 리턴

           }

          

           else// 유저가 원하는 만큼 성공적으로 모두 읽은 경우

           {

                     myprint("All Received! ");

                     return 0;                    

           } 

}

 

이런 식으로?

요점은 못읽은 데이터 크기를 기억해서 상위 레벨 호출자에게 내가 이만큼밖에 못 받았다오 하고 알려줘야 하는 것이다.


덧글

댓글 입력 영역