본문 바로가기
컴퓨터 기초/TCP&IP

13.다양한 입출력 함수들

by 인생여희 2020. 8. 18.

 

#.send & recv.

리눅스 기반에서도 윈도우 기반의 send, recv 함수가 존재하며, 이둘은 차이가 나지 않는다. 리눅스의 write, read 함수와 다른 점은 옵션을 넣어줄 수 있다는 점이다.

 

#.send 함수 소개.

 

#include <sys/socket.h>

// 성공 시 전송된 바이트 수, 실패 시 -1 반환

ssize_t send(int         sockfd,

             const void *buf,

             size_t         nbytes,

             int              flags);

 

- sockfd : 데이터 전송 대상과의 연결을 의미하는 소켓의 파일 디스크립터 전달,

- buf : 전송할 데이터를 저장하고 있는 버퍼의 주소 전달.

- nbytes : 전송할 바이트 수 전달.

- flags : 데이터 전송 시 적용할 다양한 옵션 전달.

 

 

 

#.recv 함수 소개

#include <sys/socket.h>

// 성공 시 수신한 바이트 수(단 EOF 전송 시 0), 실패 시 -1 반환

ssize_t recv(int    sockfd,

             void  *buf,

             size_t nbyte,

             int    flags);

 

- sockfd : 데이터 수신 대상과의 연결을 의미하는 소켓의 파일 디스크립터 전달,

- buf : 수신할 데이터를 저장하고 있는 버퍼의 주소 전달.

- nbytes : 수신할 수 있는 최대 바이트 수 전달.

- flags : 데이터 수신 시 적용할 다양한 옵션 전달.

 

#.여러옵션들

옵션(Option)

의미

send

recv

MSG_OOB

긴급 데이터(Out-of-band data)의 전송을 위한 옵션.

O

O

MSG_PEEK

입력버퍼에 수신된 데이터의 존재유뮤 확인을 위한 옵션.

 

O

MSG_

DONTROUTE

데이터 전송과정에서 라우팅 테이블을 참조하지 않을 것을 요구하는 옵션. 따라서 로컬(Local) 네트워키 상에서 목적지를 찾을 때 사용되는 옵션.

O

 

MSG_

DONTWAIT

입출력 함수 호출과정에서 블로킹 되지 않을 것을 요구하기 위한 옵션. 즉 넌-블로킹 IO의요구에 사용되는 옵션

O

O

MSG_

WAITALL

요청한 바이트 수에 해당하는 데이터가 전부 수신될 때까지, 호출된 함수가 반환되는 것을 막기 위한 옵션

 

O

 

#.ready & writev 함수의 적절한 사용

 

- 전송해야 할 데이터가 여러개의 버퍼(배열)에 나뉘어 있는 경우,모든 데이터의 전송을 위해서는 여러 번의 write 함수호출이 요구되는데,이를 딱 한번의 writev 함수호출도 대신할 수 있으니 효율적이다.

 

- 입력버퍼에 수신된 데이터를 여러 저장소에 나눠서 읽어 들이고 싶은 경우에도, 여러번의 read 함수가 아니라 한번의 ready 함수를 호출하는 것이 보다 효율적

 

- c언어 차원에서 함수의 호출횟수가 적으면 그만큼 성능 향상

 

+ 전송되는 패킷의 수를 줄일 수 있다는데 더 큰 의미가 있음

 

- writev 함수는 (성능 향상을 위해 명시적으로) Nagle 알고리즘이 중지된 상황에서 더 활용의 가치가 높음

 

- 여러 배열에 나눠져 있는 데이터를 전송순서에 맞춰 큰 하나의 배열에 옮겨놓고(복사해놓고) 한 번의 write함수를 호출하는 것과 writev는 동일한 결과를 얻을 수 있으나,보다 편리하므로 사용할 수 있을 때 writev, ready를 적극 사용하자.

 

 

#.readv & writev 입출력 함수

 - 데이터 송수신의 효율성을 향상시키는데 도움이 되는 함수

 - 데이터를 모아서 전송하고, 모아서 수신하는 기능의 함수 => 입출력 함수 호출의 수를 줄일 수 있음.

 

 struct iovec

 {

   void  *iov_base; // 버퍼의 주소 정보

   size_t iov_len;  // 버퍼의 크기 정보

 }

 

 

 

#.writev 함수예제

 

//성공 시 전송된 바이트 수, 실패 시 -1 반환

ssize_t writev(int                   filedes,

                const struct iovec *iov,

                int                          iovcnt);

 

- filedes : 데이터 전송의 목적지를 나타내는 소켓의 파일 디스크립터 전달,

           단 소켓에만 제한되는 함수가 아니기 때문에, read 함수처럼 파일이나 콘솔 대상의 파일 디스크립터도 전달가능하다.

- iov : 구조체 iovec 배열의 주소 값 전달, 구조체 iovec의 변수에는 전송할 데이터의 위치 및 크기 정보가 담긴다.

- iovcnt : 두 번째 인자로 전달된 주소 값이 가리키는 배열의 길이정보 전달.

 

 

 

#.readv 함수예제

 

 #include <sys/uio.h>

 // 성공 시 수신된 바이트 수, 실패 시 -1 반환

 ssize_t readv(int                  filedes,

                const struct iovec  *iov,

                int                 iovcnt);

 

- filedes : 데이터를 수신할 파일(혹은 소켓)의 파일 디스크립터를 인자로 전달.

- iov     : 구조체 iovec 배열의 주소 값 전달, 구조체 iovec의 변수에는 전송할 데이터의 위치 및  크기 정보가 담긴다.

- iovcnt  : 두 번째 인자로 전달된 주소 값이 가리키는 배열의 길이정보 전달.

 

 

 

 

 

 

  [출처] : 윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어

'컴퓨터 기초 > TCP&IP' 카테고리의 다른 글

15.소켓과 표준 입출력  (0) 2020.08.19
14.멀티캐스트 & 브로드캐스트  (0) 2020.08.18
12.멀티플렉싱  (0) 2020.08.14
11.프로세스간 통신  (0) 2020.08.14
10.멀티프로세스 기반의 서버구현  (0) 2020.08.13