네트워크

[네트워크] send&recv, readv&writev 입출력 함수

양원준 2022. 11. 29. 14:37
728x90


send&recv 입출력함수

ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);
ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);

 

 

윈도우 기반 send&recv 함수와 동일

  • sockfd : 파일 디스크립터
  • buf : 데이터 저장할 버퍼의 주소값
  • nbytes : 수신 가능한 최대 바이트 수
  • flags : 적용할 다양한 옵션 정보

 

 

 

send&recv 함수 옵션

 

옵션정보는 | 연산자를 이용해 둘 이상 동시 지정 가능

그러나 옵션의 종류와 지원 여부는 운영체제에 따라 차이 있음

 

 

MSG_OOB : 긴급 메시지 전송 옵션

  • MSG_OOB 메시지를 받으면 SIGURG 시그널이 발생, 따라서 이에 대한 처리를 위한 시그널 핸들링 필요
  • 단, FCNTL 함수의 호출을 통해 해당 소켓의 소유자를 현재 실행중인 프로세스로 변경해야함
fcntl(recv_sock, F_SETOWN, getpid());
state = signation(SIGURG, &act, 0);

 

 

긴급메시지의 예시

  • MSG_OOB는 우리가 생각하는 긴급의 형태와 다름
  • Urgent-mode를 이용하여 긴급 상황의 발생을 알려 응급조치를 취하도록 도울 뿐
  • MSG_OOB라고 더 빨리 전송되지 않음
  • 긴급으로 보낸 메시지의 양에 상관 없이 1바이트만 반환

 

urgent mode의 동작원리

 

 

URG_OOB가 설정된 데이터가 전달되면, 전달받은 운영체제는 SIGURG 시그널을 발생시켜 메시지의 긴급 처리가 필요한 상황임을 프로세스에 알림

 

URG=1 --> 긴급 메시지가 존재하는 패킷이다~

URG Pointer=3 --> 긴급메시지가 설정된 위치정보~

 

 

 

MSG_PEEK : 입력버퍼에 수신된 데이터의 존재유무 확인

MSG_DONTWAIT : 로컬 네트워크상 목적지를 찾을 때

recv(recv_sock, buf, sizeof(buf)-1, MSG_PEEK|MSG_DONTWAIT);

 

위는 옵션 지정으로 인해 블로킹 되지 않고 데이터의 존재 유무를 확인하게 됨

버퍼에서 데이터를 읽으면 소멸되지만, MSG_PEEK옵션이 지정되면 데이터를 읽어도 소멸안됨

 

 

 

readv&writev 입출력함수

ssize_t writev(int filedes, cont struct iovec * iov, int iovcnt);

 

둘 이상의 영역에 나뉘어 저장된 데이터를 묶어 한번의 함수호출로 전송 가능

 

ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);

 

한번의 함수호출로 데이터를 둘 이상의 영역에 나눠서 저장 가능

 

writev 가 유용한 이유

  • 함수의 호출횟수를 줄일 수 있다
  • 잘게 나뉜 데이터들을 출력버퍼에 한번에 밀어 넣기 때문에 하나의 패킷으로 구성되어서 전송될 확률이 높음, 따라서 전송속도의 향상으로도 이어질 수 있음

 

 

 

 

 

 

728x90