readv & writev 함수의 사용 ![]() ![]()
|
데이터 송수신의 효율성 향상시키는데 도움이 되는 함수들.
데이터를 모아서 전송하고 , 모아서 수신하는 함수
#include <sys/uio.h>
ssize_t writev(int filedes, const struct iovec * iov, int iovcnt);
- iov : 구조체 iovec 배열의 주소값 전달 , 구조체 iovec 의 변수에는 전송할 데이터의 위치 및 크기 정보가 담긴다.
- int main()
struct iovec vec[2]]
buf1 = abcd..;
buf2 = 1234567;
vec[0].iov_base = buf1;
vec[0].iov_len = 3;
vec[0].iov_base = buf2;
vec[0].iov_len = 3;
str_len = writev(1,vec, 2);
put() = ABC123
str_len = 6;
+ readv & writev 함수의 적절한 사용
- 전송해야 할 데이터가 여러개의 버퍼(배열) 에 나뉘어 있는 경우, 모든 데이터의 전송을 위해서는 여러번의 write 함수 호출이 요구되는데 , 이를 딱 한번의 wrtie 함수 호출로 대신할수 있어 효율적이다.
- WriteV함수는 nagle 알고리즘이 중지된 상황에서 더 활용의 가치가 높다.
read, write와 기본적으로 동일하나, 다수의 버퍼의 데이터를 한번에 출력/기록 할 수 있다.
Prototype
int writev( int fd, struct iovec iov[], int iovcount );
int readv( int fd, struct iovec iov[], int iovcount );
struct iovec {
int readv( int fd, struct iovec iov[], int iovcount );
struct iovec {
caddr_t iov_base; // 버퍼의 시작 포인터
int lov_len; // 버퍼의 바이트 사이즈
int lov_len; // 버퍼의 바이트 사이즈
}
sample code
struct iovec iov[3];
iov[0].iov_base = buf1;
iov[0].iov_len = strlen(buf1);
iov[1].iov_base = buf2;
iov[1].iov_len = strlen(buf2);
iov[2].iov_base = buf3;
iov[2].iov_len = strlen(buf3);
writev( fd, &iov[0], 3 );
iov[0].iov_base = buf1;
iov[0].iov_len = strlen(buf1);
iov[1].iov_base = buf2;
iov[1].iov_len = strlen(buf2);
iov[2].iov_base = buf3;
iov[2].iov_len = strlen(buf3);
writev( fd, &iov[0], 3 );
<script src="http://iich.tistory.com/plugin/CallBack_bootstrapper?&src=http://s1.daumcdn.net/cfs.tistory/v/0/blog/plugins/CallBack/callback&id=103&callbackId=iichtistorycom1035709&destDocId=callbacknestiichtistorycom1035709&host=http://iich.tistory.com&float=left&random=729"></script>
'SYSTEM PROGRAMMING' 카테고리의 다른 글
소켓과 표준 입출력 ( 리눅스 ) (0) | 2015.08.05 |
---|---|
멀티 캐스트 & 브로드 캐스트 (0) | 2015.08.05 |
MSG_PEEK | MSG_DONTWAIT (0) | 2015.08.05 |
MSG_OOB 긴급 메시지 수신 (0) | 2015.08.05 |
select 함수의 이해와 서버의 구현 (0) | 2015.08.05 |