2016년 5월 22일 일요일

뇌자극 TCP_IP 프로그래밍 12강 요약

1. 소켓 입출력 함수의 데이터 입출력 제어

TCP 전용 입출력 함수
#include <sys/types.h>
#include <sys/socket.h>

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

sockfd : 소켓 지시사
buf : 데이터 저장을 위한 버퍼
len : 버퍼의 크기

UDP 전용 입출력 함수
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flage,
                                        struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendto(int sockfd, void *buf, size_t len, int flage,
                                      const  struct sockaddr *dest_addr, socklen_t *addrlen);

sockfd : 소켓 지시사
buf : 데이터 저장을 위한 버퍼
len : 버퍼의 크기
src_addr : 데이터를 보낸 측의 주소
dest_addr : 데이터를 받을 측의 주소

소켓 함수는 flags 매개변수를 이용하면 여러 일을 할 수 있다

MSG_PEEK : 데이터를 읽은 후 버퍼의 데이터를 지우지 않는다. 이 값은 여러 서브 루틴이 하나의 소켓으로부터 값을 읽기 위해서 대기하고 있을 때 유용하다

MSG_DONTROUTE : 데이터 전송시 라우팅 테이블을 참조 하지 않을 것을 명시한다.
결국 지역 네트워크에서만 패킷을 전송하겠다는 의미다.

MSG_DONTWAIT : 비봉쇄 통신을 시도한다.

MSG_OOB : out-of-band 데이터로 전송함을 나타낸다.

2. OOB 통신

OOB는 긴급히 전달해야 할 데이터가 있을 때 사용한다.
정보의 우선순위가 아닌 중요한 데이터라는 것을 알려주는 것이다.

버퍼가 비어지길 기다리지 않고 바로 전송한다.
Nagle  알고리즘을 무시한다.
TCP 소켓에서만 사용된다

OOB 통신 방법

보내는 측 : MSG_OOB만 설정하면 된다.
send(sockfd, buf, MAX_LINE-1, MSG_OOB);

받는 측 : 시그널을 발생시켜야 하므로 약간 더 복잡하다.
signal(SIGURG, urg_handler);
fcntl(sockfd, F_SETOWN, getpid());

send(sockfd, "A", 1, MSG_OOB);

3. 표준 입출력 함수

리눅스는 소켓도 파일로 다루기 때문에 표준 입출력 함수를 사용할 수 있다.

스트림을 제어하는 표준 입출력 함수

저수준 함수를 사용하면 데이터를 저장하기 위한 버퍼만 제공할 뿐, 
전혀 관리를 하지 않는다. 개발자가 직접 데이터를 관리해야 한다.
개발자가 구분자를 지정해서 활용해야 한다.
이럴 때 표준 입출력 함수를 이용하면 간단하게 처리할 수 있다.

소켓 프로그래밍이라면 read함수 대신 fgets를, write 함수 대신 fputs를 사용하면 된다.

파일 지정 번호로부터 파일 스트림 가져오기

소켓은 int 형의 파일 지정 번호를 사용한다.
하지만 모든 표준 입출력 함수는 파일 스트림 객체임 FILE 자료형을 사용하며, 
형 변환이 불가능하다. 
fdopen 함수를 이용하면 파일 지정 번호를 파일 스트림으로 열수 있다.

#include <stdio.h>
FILE *fdopen(int fd, const char *mode);

fd : 파일 스트림을 얻어올 소켓 지시자
mode : 파일 스트림의 접근 방식을 지정한다.
 r : 읽기 전용으로 연다
 w : 쓰기 전용으로 연다
 r+ : 읽기/쓰기로 연다
 w+ : 읽기/쓰기로 연다. 만약 파일이 존재하지 않으면, 파일을 새로 만든다. 
        기존에 파일이 존재 한다면, 파일을 크기 0으로 만든다.

사용이 끝난 후에는 fclose 함수로 닫아줘야 한다
#include <stdio.h>
int fclose(FILE *fp);

표준 입출력 함수의 한계

표준 입출력 함수들은 개발자의 수고를 덜어주기 위해 만들어졌다.
이러한 함수들은 대개 범용적으로 만들어져서 어떤 용도로든 무난하게 사용 가능하다
일반적으로 쓰기에는 편하지만 특수한 용도에는 적합하지 않을 수도 있으며 
성능에 문제가 있을 수도 있다.
표준 입출력 함수는 단지 읽기 쓰기 용도로 쓸 경우 
저수준 입출력 함수보다 20~30% 느리다.
대량의 데이터를 다루고 성능이 중요하다면 
표준 입출력 함수를 쓸 것인지 저수준 입출력함수를 쓸 것인지 고민해봐야 한다.

댓글 없음:

댓글 쓰기