서버 함수

bind

int bind(
    SOCKET s, // 클라이언트 접속 수용을 목저긍로 만든 소켓
    const struct sockaddr* name, // 지역 IP 주소와 지역 포트 번호가 담긴 구조체의 주소
    int namelen // 소켓 주소 구조체 변수의 길이
);
// 반환값 : 성공(0), 실패(SOCKET_ERROR)

서버의 지역 IP 주소와 지역 포트 번호를 결정하는 역할을 한다.

 

listen

int listen(
    SOCKET s, // bind 함수에 의해 지역 IP 주소와 지역 포트 번호가 설정된 상태
    int backlog // 접속 가능한 클라이언트의 개수. 프로토콜의 지원 가능한 최대값은 SOMAXCONN
);
// 반환값 : 성공(0), 실패(SOCKET_ERROR)

소켓과 결합된 TCP 포트 상태를 LISTENING으로 바꾸는 역할을 한다.

즉, 클라이언트 접속을 받아들일 수 있는 상태가 된것이다.

 

accept

SOCKET accept(
    SOCKET s, // 클라이언트 접속을 수용할 목적으로 만든 소켓
    struct sockaddr* addr, // 소켓 주소 구조체 변수의 주소
    int* addrlen
);
// 반환값 : 성공(new socket), 실패(INVALID_SOCKET)

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

접속한 클라이언트의 IP 주소와 포트 번호를 알려준다.

접속한 클라이언트가 없을 경우 서버를 대기 상태로 만든다.

 

 

클라이언트 함수

connect

int connect(
    SOCKET s, // 서버와 통신하기 위해 만든 소켓
    const struct sockaddr* name,
    int namelen, // 구조체의 크기
);
// 반환값 : 성공(0), 실패(SOCKET_ERROR)

클라이언트가 서버에 접속하여 TCP 프로토콜 수준의 연결이 이루어지도록 한다.

 

 

데이터 전송 함수

send

int send(
    SOCKET s, // 통신할 대상과 연결된 소켓
    const char* buf, // 보낼 데이터를 담고 있는 어플리케이션 버퍼의 주소
    int len, // 보낼 데이터의 크기
    int flags // 대부분 0 사용. MSG_DONTROUTE, MSG_OOB를 사용하는 경우도 드물게 있다
);
// 반환값 : 성공(보낸 바이트 수), 실패(SOCKET_ERROR)

어플리케이션 데이터를 송신 버퍼에 복사함으로써 하부 프로토콜(TCP/IP)에 의해 데이터가 전송되도록 한다.

데이터 복사가 성공적으로 이루어지면 값을 곧바로 리턴하지만 실제 데이터 전송이 완료된 것은 아니다.

 

첫번째 인자로 사용한 소켓의 특성(블로킹 소켓, 넌블로킹 소켓)에 따라 성공시 반환값이 조금 달라진다.

블로킹 소켓이라면 len과 같은 값, 넌블로킹 소켓이라면 송신 버퍼의 여유 공간만큼 데이터를 복사하기 때문에 복사한 데이터 바이트 수를 리턴한다. (최소1, 최대 len)

 

recv

int recv(
    SOCKET s, // 통신할 대상과 연결된 소켓
    char* buf, // 받은 데이터를 저장할 어플리케이션 버퍼의 주소
    int len, // 수신 버퍼로부터 복사할 최대 데이터 크기
    int flags // 대부분 0 사용. MSG_PEEK, MSG_OOB를 드물게 사용한다
              // 복사하고 나면 해당 데이터를 수신 버퍼에서 삭제하지만 MSG_PEEK 사용 시 삭제하지 않는다
);
// 반환값 : 성공(받은 바이트 수 또는 0), 실패(SOCKET_ERROR)

수신 버퍼에 도착한 데이터를 어플리케이션 버퍼로 복사하는 역할을 한다.

수신 버퍼에 데이터가 도달한 경우 복사한 바이트 수를 리턴하고 접속 종료 요청이라면 0을 리턴한다.

 

recv 사용 시 주의할점은 len보다 작은 데이터가 복사될 수 있기 때문에 받을 데이터의 크기를 미리 알고 있다면 전부 받을 때까지 여러 번 호출해야 한다.

+ Recent posts