지난 포스팅까지 TCP프로토콜을 사용하는 서버와 클라이언트를 구현해보았다.
이번 포스팅에서는 서로 연결된 네트워크끼리 데이터를 통신하는 send함수와 recv함수에 대해서 알아본다.

1) send 함수

send(socket, buffer, sizeof(buffer), 0);

send함수를 통해 소켓으로 연결되어있는 다른 프로세스에게 데이터를 보낼 수 있다.

- 1번째 인자: 데이터를 보낼 연결상태의 소켓
- 2번째 인자: 전송할 데이터를 담고있는 데이터버퍼의 포인터. 데이터버퍼는 char배열 형식이다
- 3번째 인자: 데이터 버퍼의 byte크기 
- 4번째 인자: 특별한 옵션을 주기 위한 플래그이다. 옵션은 '|| (OR)'로 조합할 수 있다. 따로 옵션을 지정하지 않는다면 0을 주어 생략가능하다.

옵션 값 옵션 값 의미
MSG_DONTROUTE 데이터를 전송할때 라우팅 테이블을 참조하지 않는다
MSG_OOB 데이터를 긴급 전송모드(Out-of-band data 모드)로 전송한다

send함수는 오류가 없다면 보냈던 데이터의 byte크기를 반환한다. 만일 오류가 발생한다면 SOCKET_ERROR라는 오류코드를 반환한다. WSAGetLastError() 함수를 호출하면 어떤 종류의 오류가 발생하였는지 확인할 수 있다.


2) recv 함수

recv(clientSocket, buffer, BUF_SIZE, 0);

recv함수를 통해 다른 프로세스로부터 온 데이터를 수신할 수 있다.

- 1번째 인자: 데이터를 수신할 연결상태의 소켓
- 2번째 인자: 수신된 데이터를 담을 데이터버퍼의 포인터. 데이터버퍼는 char배열 형식이다
- 3번째 인자: 데이터 버퍼의 byte크기
- 4번째 인자: 특별한 옵션을 주기 위한 플래그. send함수와 마찬가지로 별 옵션을 주지않는다면 0을 기입한다.

recv함수도 정상적으로 수신되었을 때에는 받은 데이터의 byte크기를 반환한다. 오류가 발생하였을때는 마찬가지로 SOCKET_ERROR를 반환한다.


이번 포스팅으로 데이터를 전송하는 send()와 recv()함수를 알아보았다.
이후 포스팅에서는 echoServer(보냈던 메세지를 그대로 답해주는 서버)를 우선 구현하여 서버와 클라이언트 통신을 다뤄볼 예정이다.

+ Recent posts