Programming Languages/C

Ch.13. send, recv, readv, writev

ubiquitous4g 2021. 4. 22. 20:45

(Linux) send & recv

#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);

// 성공시 전송된 바이트 수, 실패시 -1 반환
// sockfd 데이터 전송 대상과의 연결을 의미 하는 소켓의 파일 디스크립터 전달
// buf    전송할 데이터를 저장하고 있는 버퍼의 주소 값 전달
// nbytes 전송할 바이트 수 전달
// flags  데이터 전송시 적용할 다양한 옵선 정보 전달
#include <sys/socket.h>

ssize_t recv(int sockfd , void *buf, size_t nbytes, int flags);

// 성공시 수신한 바이트 수(단 EOF 전송시 0), 실패시 -1 반환
// sockfd 데이터 수신 대상과의 연결을 의 미하는 소켓의 따일 디스크립 터 전달
// buf    수신된 데이터를 저장할 버퍼의 주소값 전달
// nbytes 수신할 수 있는 최대 바이트 수 전달
// flags  데이터 수신시 적용할 다앙한 옵션 정보 전달

MSG 008: 긴급 메시지의 전송

추가

입력버퍼 검사

추가

readv & writev

데이터를 모아서 전송하고, 모아서 수신하는 기능의 함수

#include <sys/uio.h>

ssize_t writev(int filedes, const struct iovec *iov, int iovcnt);

// 성공시 전송된 바이트 수, 실패시 -1 반환
// filedes  데이터 전송의 목적지를 나타내는 소켓의 파일 디스크립터 전달 
//          단 소켓에만 제한된 함수가 아니기 때문에, read 함수처럼 파일이나 콘솔 대상의 파일 디스크립터도 전달 가능
// IOV      구조체 lovec 배열의 주소 값 전달, 구조체 lovec의 변수에는 전송할 데이터의 위치 및 크기 정보가 담긴다.
// iovcnt   두 번째 인댐 전달된 주소 값01 가리키는 배열의 길이정보 전달

struct iovec
{
  void * iov_base;  // 벼퍼의 주소 정보
  size_ t iov _len; // 버퍼의 크기 정보
}

#include <stdio.h>
#include <sys/uio.h>

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;
}

 

#include <sys/uio.h>

ssize_t readv(int filedes, const struct iovec *iov , int iovcnt);

// 성공시 수신된 바이트 수, 실패시 -1 반환

// filedes 데이터를 수신할 파일(혹은 소켓)의 파일 디스크립터를 민자로 전달
// iov     데이터를 저장할 위치와 크기 정보를 담고 있는 iovec 구조체 배열의 주소 값 전달
// iovcnt  두 번째 인자로 전달된 주소 값이 가리키는 배열의 길이정보 전달

#include <stdio.h>
#include <sys/uio.h>
#define BUF_SIZE 100

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;
}