네트워크 프로그래밍
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를 호출하는 것이 효율적
전송하는 패킷의 수를 줄일 수 있다