논블록킹 소켓

소켓함수 호출시 조건이 만족되지 않아도 함수가 리턴한다.
ioctlsocket 함수로 소켓모드를 변경한다.

소켓함수

Accept

접속한 클라이언트와 통신할수 있도록 새로운 소켓을 생성하여 리턴한다.

1
2
3
4
// 인자 : LISTENING 상태인 소켓, 소켓 주소 구조체, 소켓주소 크기를 담은 정수형 변수의 포인터
SOCKET accept(SOCKET s, struct sockaddr *addr, int *addrlen);

// 성공: 새로운 소켓 리턴, 실패 : INVALID_SOCKET
  • 블록킹
    • 새로운 연결이 없다면 블록된다.
  • 넌블록킹
    • 새로운 연결이 없으면 WOULDBLOCK 리턴한다.

Connect

서버와 논리적 연결을 설정한다.

1
2
3
4
// 인자 : 서버와 통신용 소켓, 소켓 주소 구조체, 소켓 주소 구조체의 길이(바이트 단위)
int connect(SOCKET s, const struct sockaddr *name, int namelen);

// 성공 : 0, 실패 : SOCKET_ERROR
  • 블록킹
    • 실제 연결이 될때까지, 즉 SYN 에 대한 ACK을 받을때 까지, 블록된다.
  • 논블록킹
    • 에러 WOULDBLOCK을 리턴한다. UDP인 경우에는 바로 리턴된다.

Send

응용 프로그램 데이터를 운영체제의 송신버퍼에 복사함으로써 데이터를 전송한다.

Send 함수는 데이터 복사에 성공하면, 곧바로 리턴한다.

따라서 Send함수가 실제 데이터를 전송하는것이 아니며, 일정시간이 지나야 전송된다.

1
2
3
4
5
// 인자: 통신할 대상과 연결된 소켓, 보낼 데이터를 담는 응용프로그램의 버퍼 주소
// 보낼 데이터의 크기(바이트 단위), Send함수 동작을 바꾸는 옵션
int send(SOCKET s, const char *buf, int len, int flags);

// 성공: 보낸 바이트 수, 실패: SOCKET_ERROR
  • 블록킹

    • 송신 버퍼의 여유공간이 Send() 함수의 세번째 인자 len보다 작은 경우, 해당 프로세스는 대기상태가 된다.
    • 송신버퍼에 충분한 공간이 생기면 프로세스는 깨어나고, len크기만큼 데이터 복사가 일어나고 Send 함수가 리턴한다.
  • 넌블록킹

    • 송신버퍼의 여유만큼 데이터 복사한후, 실제복사한 바이트 수를 리턴한다. OS 송신버퍼에 공간이 없을때(부족할때), WOULDBLOCK을 리턴한다.

Recv

OS 수신버퍼에 도착한 데이터를 응용프로그램 버퍼에 복사한다.

1
2
3
4
// 소켓, 받을 버퍼, 받을 데이터의 총 데이터량, Recv 동작 플래그
int recv(SOCKET s, char *buf, int len, int flags);

// 성공: 받은 데이터 수, 실패: SOCKET_ERROR
  • 블록킹
    • 소켓 수신버퍼에 수신된 데이터가 없으면 프로세스는 Sleep 한다.

데이터가 도착하면 (그것이 충분한 크기가 아니더라도) 깨어난다.

  • 논블록킹
    • 수신버퍼가 비어 있을때 바로 WOULDBLOCK 리턴한다.

기타 소켓함수

1
2
3
socket(); // 사용자가 요청한 프로토콜을 이용해 통신할수 있도록 내부적으로 리소스 할당. 일종의 핸들인 소켓을 리턴
bind(); // 소켓의 지역 IP 주소와 지역 포트번호를 할당한다.
listen(); // 소켓의 TCP 포트 상태를 LISTENING 상태로 바꾼다.