01
06

소켓모드는 블로킹(blocking)과 넌블로킹 (non-blocking)으로 구분됨

 

블로킹 소켓 : 

소켓함수 호출 시 조건에 만족하지 않으면 함수 리턴하지

않고 해당 스레드는 대기 상태가 됨.

네트워크에서 블로킹 소켓을 사용하려면 멀티스레드를 

사용해서 해결해야함.

 

1
2
//브로킹 소켓 생성
SOCKET listen_Sock = socket(AF_INET, SOCK_STREAM, 0)
cs

 

넌블로킹 소켓 : 

소켓함수 호출 시 조건이 만족하지 않아도 함수가 리턴해서 스레드는 계속 진행됨, 다른 작업 가능

멀티스레드를 사용하지 않아도 여래개의 소켓 입출력 처리할 수 있다. 

단점으로는 소켓 함수를 호출할때마다 WSAEWOULDBLOCK 등 오류 코드 확인해야함

 

1
2
3
u_long on =1;
ret = ioctlsocket(listen_Sock, FIONBIO, &on);
if(ret==SOCKET_ERROR) err_quit(ioctlsocket());
cs

 

넌블로킹 함수 호출했을때 조건이 만족하지 않아 작업을 완료하지 못하면

소켓 함수는 오류를 리턴하는데, 이때 WSAGetLastError()함수를 호출해서

오류코드 WSAEWOULDBLOCK이되면 정상작동하게 한다.

 

이는 조건이 만족되지 않음을 나타내므로 나중에 다시 소켓 함수를 호출하면 된다.

만약 이 오류가 아닐 경우에는 예상하지 못한 오류이기 떄문에 return을 해준다.

Send()함수의 경우 전송할 버퍼공간이 없다면 이 WSAEWOULDBLOCK이 뜬다.

다시 send를 호출해서 보내지게 하면 된다. 

1
2
3
4
5
6
7
    if (iSendByte == SOCKET_ERROR)
        {
            if (WSAGetLastError() != WSAEWOULDBLOCK)
            {
                return -1;
            }
        }
cs

 

COMMENT