네트워크 프로그래밍 13 다양한 입출력 함수들

zh025700·2022년 6월 6일
0

네트워크 프로그래밍


13. 다양한 입출력 함수들

send & recv 입출력 함수

데이터 송수신시 적용할 옵션정보를 택할 수 있다

 ssze_t send(int sockfd, const void* buf, size_t nbytes, int flags);
 ssze_t recv(int sockfd, const void* buf, size_t nbytes, int flags);
  • 성공시 송수신한 바이트 수 실패시 -1 반환
  • sockfd: 연결을 의미하는 fd
  • buf: 데이터를 저장할 저장한 버퍼의 주소값
  • nbytes: 전송할 수신할 수 있는 바이트 수
  • flags: 송수신시 적용할 옵션정보

read write와 send recv의 차이

  • recv send는 옵션을 명시할 수 있다
    • or연산자를 이용해 둘 이상의 옵션을 명시할 수 있다
  • read write는 보편적인 함수이다

MSG_PEEK|MSG_DONTWAIT

  • 입력버퍼에 수신된 데이터가 존재하는지 확인하는 옵션이다

    버퍼에 있는 데이터를 읽어도 데이터가 남아있다.

MSG_DONTWAIT은 데이터가 존재하지 않아도 블로킹 상태에 두지 않기 위해서이다

readv, writev

여러 버퍼의 데이터를 모아서 전송하고, 한 데이터를 분산시켜 여러 버퍼에 수신한다

 ssize_t wrtiev(int fd, const struct iovec* iov, int iovcnt);
  • 성공 시 전송된 바이트 수, 실패시 -1
  • fd: 데이터 전송의 목적지를 나타내는 fd.
  • iov: 구조체 iovec 배열의 주소 값, iovec에는 전송할 데이터의 위치 및 크기 정보가 담김
  • iovcnt: 두번째 인자 배열의 길이

writev = iovcnt만큼 iovec 배열들에 저장된 값들을 모아서 하나로 파일디스크립터에 전송한다

struct iovec{
    void* iov_base // 버퍼의 주소 정보
    size_t iov_len / / 버퍼의 크기 정보
}
  • iovec은 전송할 데이터가 저장되어 있는 버퍼의 주소값, 실제 전송할 데이터의 크기 정보를 담기 위해 정의
  • 배열들에 크기를 정해 만드는 구조체라 생각하자!
ssize_t readv(int fd, const struct iovec* iov, int iovcnt);
  • 성공 시 수신된 바이트 수, 실패시 -1
  • fd: 수신할 파일 디스크립터
  • iov: 데이터를 저장할 iovec 구조체 배열의 주소값
  • iovcnt: 두번째 인자의 길이 정보

readv = iovcnt 만큼의 iov배열에 데이터를 iov 배열의 길이 만큼 쪼개 저장한다

readv writev 의 적절한 사용

  • 전송해야 할 데이터가 여러 개의 배열에 나뉘어 있는 경우
    • 여러번 write보다 writev를 이용하면 함수 호출을 줄일 수 있어 효율적이다.
  • 입력버퍼의 데이터를 여러 장소에 나눠서 저장하고 싶은 경우
    • read 여러번 호출보다 readv를 호출하는 것이 효율적
  • 전송하는 패킷의 수를 줄일 수 있다
    • 하나만 보내니깐
profile
정리

0개의 댓글