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함수
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)
send(sock, "890", strlen("890"), MSG_OOB);
URG = 1 : 긴급 메시지가 존재하는 패킷
URG Pointer = 3 : Urgent Pointer의 위치가 오프셋 3의 위치에 있음
readv함수
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
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를 처리함