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
'네트워크' 카테고리의 다른 글
[네트워크] HTTP (0) | 2023.06.12 |
---|---|
[네트워크] 쓰레드, 멀티 쓰레드 (0) | 2023.06.11 |
[네트워크] IO 멀티플렉싱 (0) | 2023.06.11 |
[네트워크] 시그널 핸들링 (0) | 2023.06.11 |
[네트워크] 멀티캐스트, 브로드캐스트 (0) | 2022.11.29 |