#.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 |