https://mintnlatte.tistory.com/241


■ 소켓통신에서 데이터 송수신 함수로는 send, recv / sendto, recvfrom 이 있다.


(1) 함수원형

  ○ send(int sockfd, const void *buf, size_t len, int flags)
  ○ recv(int sockfd, const void *buf, size_t len, int flags)
  ○ sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
  ○ recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)


(2) TCP 데이터 송수신
: send() / recv()함수는 address를 지정할수 없기 때문에, 연결지향 방식인 TCP 통신에서 사용된다.
  (물론 sendto/recvfrom도 사용 가능)

○ send(int sockfd, const void *buf, size_t len, int flags)

- sockfd : 목적지의 주소정보를 갖는 파일 디스크립터
buf : 전송하기위한 데이터의 포인터
len : 데이터의 길이
flags : 함수의 호출이 어떤일을 할지 나타내는 플래그

return value : 전송 성공 시 전송한 바이트 수 반환 , 실패 시 -1 반환


○ recv(int sockfd, const void *buf, size_t len, int flags)

sockfg : 접속된 소켓의 파일 디스크립터
buf : 수신 데이터를 저장할 버퍼의 포인터
len : 수신할 데이터의 길이
flags : 함수의 호출이 어떤일을 할지 나타내는 플래그

return value : 전송 성공 시 전송한 바이트 수 반환 , 실패 시 -1 반환

=> 서버측에서는 accept하여 생성된 소켓을, 클라이언트측에서는 connect에 사용한 소켓을,
    이용하여 데이터를 송수신 한다.


(3) UDP 데이터 송수신
: sendto() / recvfrom()함수는 address를 지정할수 있기 때문에, 비연결지향 방식인 UDP 통신에서 사용된다.

○ sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)

sockfg : 소켓의 파일 디스크립터
buf : 전송될 데이터를 가지고 있는 버퍼
- len : 버퍼의 데이터 길이
flags : 함수의 호출이 어떤일을 할지 나타내는 플래그
- dest_addr : 데이터가 전송될 원격 호스트의 주소
len : 주소정보 구조체의 길이(구조체의 길이를 읽으므로 int형)


○ recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)

sockfg : 바인드된 소켓의 파일 디스크립터
buf : 수신되는 데이터를 저장할 버퍼의 포인터
- len : 버퍼의 길이
flags : 함수의 호출로 어떤 작업을 할 건지 명시하는 플래그
- src_addr : 수신받은 데이터를 송신한 단말의 주소를 리턴받기 위한 버퍼 포인터
- addrlen : 주소정보 구조체의 길이(구조체의 길이를 입력 받으므로 포인터형)


(4) 데이터 송수신용 시스템 호출

- write : Stream소켓을 통한 데이터 송신
- read : Stream소켓을 통해 데이터 수신

- send : Option을 규정하는 데이터 송신(Stream 소켓)
- recv : Options을 규정하는 데이터 수신(Stream 소켓)

- sendto : Datagram소켓을 통해 데이터 송신
- recvfrom : Datagram소켓을 통해 데이터 수신