728x90
writev & readv
- 기존 write, read 함수는 하나의 버퍼를 가지고 데이터를 송수신
- writev, readv 함수는 둘 이상의 버퍼를 가지고 데이터를 송수신
- writev : 둘 이상의 영역에 나뉘어진 데이터를 묶음
-> files : 소켓이나 파일의 디스크립터 전달
-> 네트워크 전송에 있어 여러 버퍼를 하나로 묶어 보내 여러 패킷을 하나의 패킷으로 묶어 보내게 되어 전송 속도 향상 및 효율성에 장점이 있음
#include <sys/uio.h>
ssize_t writev(int fildes, const struct iovec* iov, int iovcnt);
struct iovec
{
void* iov_base; // 버퍼의 주소
size_t iov_len; // 버퍼의 크기
}
int main(int argc, char *argv[])
{
struct iovec vec[2];
char buf1[]="ABCDEFG";
char buf2[]="1234567";
int str_len;
vec[0].iov_base=buf1;
vec[0].iov_len=3;
vec[1].iov_base=buf2;
vec[1].iov_len=4;
str_len=writev(1, vec, 2);
puts("");
printf("Write bytes: %d \n", str_len);
return 0;
}
- readv : 둘 이상의 영역에 데이터를 나눠서 저장
-> iovec에 배열에 등록된 버퍼의 순서대로 버퍼의 크기만큼 저장
#include <sys/uio.h>
ssize_t readv(int fildes, const struct iovec* iov, int iovcnt);
int main(int argc, char *argv[])
{
struct iovec vec[2];
char buf1[BUF_SIZE]={0,};
char buf2[BUF_SIZE]={0,};
int str_len;
vec[0].iov_base=buf1;
vec[0].iov_len=5;
vec[1].iov_base=buf2;
vec[1].iov_len=BUF_SIZE;
str_len=readv(0, vec, 2);
printf("Read bytes: %d \n", str_len);
printf("First message: %s \n", buf1);
printf("Second message: %s \n", buf2);
return 0;
}
728x90
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 14-1. 멀티캐스트(Multicast) (0) | 2021.03.14 |
---|---|
열혈 TCP/IP 13-3. 윈도우에서의 MSG_OOB 처리 (0) | 2021.03.14 |
열혈 TCP/IP 13-1. send & recv 입출력 함수 (0) | 2021.03.14 |
열혈 TCP/IP 12-2. select 함수의 이해와 서버의 구현 (0) | 2021.03.08 |
열혈 TCP/IP 12-1. IO 멀티플렉싱 기반의 서버 (0) | 2021.03.05 |