본문 바로가기
programing/Networks

입출력 함수

by RedWiz 2015. 5. 18.

 

MSG_OOB.zip

 

-

int send( SOCKET s, const char* buf, int flags );

int recv( SOCKET s, char* buf, int flags );

// 성공시 송수신된 바이트 수, 실패시 SOCKET_ERROR (EOF 전송시 0)

 

- 옵션

 

옵션

 의미

 send()

 recv()

 MSG_OOB

 긴급 데이터(Out-of-band data)전송 옵션

 O

 O

 MSG_PEEK

 입력버퍼에 수신된 데이터 존재유부 확인 옵션

 

 O

 MSG_DONTROUTE

 전송과정에서 Routing 테이블을 참조 안함 요구

 Local 네트워크 상에서 목적지 찾을 때 사용

 O

 

 MSG_DONTWAIT

 입출력 함수 호출 과정에서 블로킹 안됨을 요구

 Non-blocking IO의 요구에 사용

 O

 O

 MSG_WAITALL

 요청한 바이트 수 데이터가 전부 수신될 때까지 호출된 함수가 반환되는 것을 막음

 

 O

 

- MSG_OOB (Out-of-band Data) : 긴급 메시지 전송

> 전혀 다른 통신 경로로 전송되는 데이터, 1바이트만 전송

> TCP의 경우 별도의 통신 경로 제공을 안하고 Urgent mode라는 것을 이용

-> TCP 헤더에 URG와 URG Pointer 존재

URG : 긴급 메시지가 존재하는 패킷임을 알람

URG Pointer : 오프셋에서 보낼 데이터 위치 가리킴

> Urgent Pointer 앞 부분에 위치한 1byte를 제외한 나머지는 일반 입력함수 호출로 읽힘

 

- 윈도우에는 리눅스에서 보인 시그널링 핸들링이 존재 안함

> MSG_OOB에 대한 이벤트 핸들링이 윈도우 기반에서 불가능

> select() 함수 이용

 

- 입력 버퍼 검사

> MSG_PEEK : recv() 함수 호출시 입력 버퍼에 존재하는 데이터가 읽혀져도 지워지지 않음

> MSG_DONTWAIT 옵션과 묶여서 블로킹 되지 않고 데이터의 존재유무 확인

 

- 리눅스의 writev(), readv() 함수는 윈도우에 정의 돼있지 않으며

윈도우에서는 중첩 입출력(Overlapped IO)를 이용함