본문 바로가기

공부/tcp/ip 프로그래밍

13장 다양한 입출력 함수들

반응형

send, recv함수 윈도우 = 리눅스

 

send함수

#include <sys/socket.h>

 

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

성공시 전송된 바이트 수, 실패시 -1 반환

 

sockfd : 데이터 전송 대상과의 연결을 의미하는 소켓의 파일 디스크립터 전달

buf : 전송할 데이터를 저장하고 있는 버퍼의 주소 값 전달

nbytes : 전송할 바이트 수 전달

flags : 데이터 전송시 적용할 다양한 옵션 정보 전달

 

recv함수

#include <sys/socket.h>

 

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

성공시 수신한 바이트 수(EOF전송시 0), 실패시 -1 반환

 

sockfd : 데이터 수신 대상과의 연결을 의미하는 소켓의 파일 디스크립터 전달

buf : 수신된 데이터를 저장할 버퍼의 주소 값 전달

nbytes : 수신할 수 있는 최대 바이트 수 전달

flags : 데이터 수신 시 적용할 다양한 옵션 정보 전달

 

옵션(option)

의미 

send

recv

 MSG_OOB

긴급 데이터(out-of-badn data)의 전송을 위한 옵션

o

o

 MSG_PEEK

입력버퍼에 수신된 데이터의 존재유무 확인을 위한 옵션

읽어 들인 정보를 입력버퍼에서 삭제하지 않음

 

o

 MSG_DONTROUTE

데이터 전송과정에서 라우팅(routing) 테이블을 참조하지 않을 것을 요구하는 옵션

따라서 로컬(local) 네트워크 상에서 목적지를 찾을 때 사용되는 옵션

o

 

 MSG_DONTWAIT

입출력 함수 호출과정에서 블로킹 되지 않을 것을 요구하기 위한 옵션

즉, 넌-블로킹(non-blocking) IO의 요구에 사용되는 옵션 

o

o

 MSG_WAITALL

요청한 바이트 수에 해당하는 데이터가 전부 수신될 때까지,

호출된 함수가 반환되는 것을 막기 위한 옵션

 

o

 

fcntl(recv_sock, F_SETOWN, getpid());

= 파일 디스크립터 recv_sock이 가리키는 소켓의 소유자(F_SETOWN)를 getpid 함수가 반환하는 ID의 프로세스로 변경시키겠다

= 파일 디스크립터 recv_sock이 가리키는 소켓에 의해 발생하는 SIGURG 시그널을 처리하는 프로세스를 getpid함수가 반환하는 ID의 프로세스로 변경시키겠다

 

MSG_OOB : 긴급 메시지의 전송

여기서의 긴급 메세지

1. 병원으로의 빠른 이동 (X)

2. 병원에서의 빠른 응급조치 (O)

 

urgent mode.pptx

send(sock, "890", strlen("890"), MSG_OOB);

URG = 1 : 긴급 메시지가 존재하는 패킷

URG Pointer = 3 : Urgent Pointer의 위치가 오프셋 3의 위치에 있음 

 

readv함수

#include <sys/uio.h>

 

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

성공시 전송된 바이트 수, 실패시 -1반환

 

filedes : 데이터 전송의 목적지를 나타내는 소켓의 파일 디스크립터 전달. 단 소켓에만 제한된 함수가 아니기 때문에, read함수처럼 파일이나 콘솔 대상의 파일 디스크립터도 전달 가능

iov : 구조체 iovec배열의 주소 값 전달, 구조체 iovec의 변수에는 전송할 데이터의 위치 및 크기 정보가 담김

iovcnt : 두 번째 인자로 전달된 주소 값이 가리키는 배열의 길이정보 전달

 

struct iovec

{

void* iov_base; //버퍼의 주소 정보

size_t iov_len;  //버퍼의 크기 정보

 

writev(1, ptr, 2);

 

 

readv

#include <sys/uio.h>

 

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

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

 

filedes : 데이터를 수신할 파일(혹은 소켓)의 파일 디스크립터를 인자로 전달

iov : 데이터를 저장할 위치와 크기 정보를 담고 있는 iovec 구조체 배열의 주소 값 전달

iovcnt : 두 번째 인자로 전달된 주소 값이 가리키는 배열의 길이정보 전달

 

readv & writev 함수의 이점

여러 영역에 나뉘어 있는 데이터들을 하나의 배열에 순서대로 옮겨다 놓고 write함수를 호출하는 것과 그 결과는 같다

1. 함수의 호출횟수를 줄일 수 있다

2. 잘게 나뉜 데이터들을 출력버퍼에 한번에 밀어 넣기 때문에 하나의 패킷으로 구성되어서 전송될 확률이 높차지고, 이는 전송속도의 향상으로도 이어질 수 있다

 

윈도우에서 MSG_OOB처리

윈도우에는 signal함수나 sigaction함수가 없음

select함수의 예외상황을 이용하여 MSG_OOB를 처리함

반응형