|
ioctlsocket함수를 사용하면 버퍼에 데이터가 쌓여 있는지 알 수 있습니다.
unsigned long rsize;
if( ioctlsocket( sock, FIONREAD, &rsize ) == SOCKET_ERROR ){
//소켓 오류
}else if( rsize > 0 ){
//버퍼에 자료가 있음.
}
참고로, 버퍼에 rsize만큼의 데이터가 들어 있을 수도 있고, 더 많이 들어 있을 수도 있습니다. ioctlsocket 호출 중이나 이후에도
네트워크에서 데이터가 더 들어와 있을 수 있기 때문에 ioctlsocket 값이 0일 때까지 계속 recv함수를 호출에서 버퍼를 비워주면
됩니다.
do{
ioctlsocket으로 버퍼 검사
recv로 버퍼 비움.
}while( rsize > 0 );
locke 님이 쓰신 글 :
: api로 소켓 프로그래밍을 처음 해보고 있습니다.
: 현재 소켓에 수신버퍼에 받은 데이터가 있는지 검사해서 있을 때만 recv 함수를 호출해서 자료를 가져오는 방법 없을까요?
: recv는.. 데이터가 들어올때까지 무조건 블록킹이라.. 다른 일을 못하고..
: select로 하자니.. 이건 데이터가 들어왔을때만 이벤트가 발생을 해서..
: 이거 말고.. 제가 임의적으로 버퍼 상태를 체크해서 값이 있을 경우만 recv를 하고싶습니다.
: 가능할까요?
:
: -locke
:
|