C/TCPIP 소켓 프로그래밍(윤성우 저)

TCP/IP 소켓 프로그래밍 10~14장 함수 복습

꾸준함. 2017. 7. 9. 17:01

[리눅스 호출한 프로세스 복사본 생성하는 함수]

#include <unistd.h>

pid_t fork(void);

->성공 시 프로세스 ID, 실패 시 -1 반환


*부모 프로세스: fork 함수의 반환 값은 자식 프로세스의 ID

*자식 프로세스: fork 함수의 반환 값은 0


[리눅스 종료된 자식 프로세스의 ID 반환하는 함수]

#include <sys/wait.h>

pid_t wait(int *statloc);

->성공 시 종료된 자식 프로세스의 ID, 실패 시 -1 반환


*WIFEXITED: 자식 프로세스가 정상 종료한 경우 '참(true)' 반환한다.

*WEXITSTATUS: 자식 프로세스의 전달 값을 반환한다.


예시)

if (WIFEXITED(status)) //정상 종료하였는가?

{

        puts("Normal termination!");

        printf("Child pass num:%d", WEXITSTATUS(status)); //그렇다면 반환 값은?

}


[리눅스 종료된 자식 프로세스의 ID 반환하는 함수2]

#include <sys/wait.h>


pid_t waitpid(pid_t pid, int *statloc, int options);

->성공 시 종료된 자식 프로세스의 ID(또는 0), 실패 시 -1 반환


*pid: 종료를 확인하고자 하는 자식 프로세스의 ID 전달, 이를 대신해서 -1을 전달하면 wait 함수와 마찬가지로 임의의 자식 프로세스가 종료되기를 기다린다

*statloc: wait 함수의 매개변수 statloc과 동일한 의미로 사용된다.

*options: 헤더파일 sys/wait.h에 선언된 상수 WNOHANG을 인자로 전달하면, 종료된 자식 프로세스가 존재하지 않아도 블로킹 상태에 있지 않고, 0을 반환하면서 함수를 빠져 나온다.


*waitpid는 wait 함수가 블로킹 상태에 놓이는 문제를 해결할 수 있는 함수이다.


[리눅스 시그널 등록 함수]

#include <signal.h>

void (*signal(int signo, void (*func)(int)))(int);

->시그널 발생 시 호출되도록 이전에 등록된 함수의 포인터 반환


SIGALRM: alarm 함수호출을 통해서 등록된 시간이 된 상황

SIGINT: CTRL+C가 입력된 상황

SIGCHLD: 자식 프로세스가 종료된 상황


[리눅스 alarm 함수]

#include <unistd.h>

unsigned int alarm(unsigned int seconds);

->0 또는 SIGALRM 시그널이 발생하기까지 남아있는 시간을 초 단위로 반환


[리눅스 signal 함수보다 안정적인 sigaction 함수]

#include <signal.h>


int sigaction(int signo, cosnt struct sigaction *act, struct sigaction *oldact);

->성공 시 0, 실패 시 -1 반환


*signo: signal 함수와 마찬가지로 시그널의 정보를 인자로 전달

*act: 첫 번째 인자로 전달된 상수에 해당하는 시그널 발생시 호출될 함수(시그널 핸들러)의 정보 전달

*oldact: 이전에 등록되었던 시그널 핸들러의 함수 포인터를 얻는데 사용되는 인자, 필요 없다면 0 전달


struct sigaction

{

        void(*sa_handler)(int);

        sigset_t sa_mask;

        int sa_flags;

}


[리눅스 파이프 생성 함수]

#include <unistd.h>

int pipe(int filedes[2]);

->성공 시 0, 실패 시 -1 반환


*filedes[0]: 파이프로부터 데이터를 수신하는데 사용되는 파일 디스크립터가 저장된다(파이프의 출구)

*filedes[1]: 파이프로부터 데이터를 전송하는데 사용되는 파일 디스크립터가 저장된다(파이프의 입구)


[리눅스 select 함수]

#include <sys/select.h>

#include <sys/time.h>

int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);

->성공 시 0 이상, 실패 시 -1 반환


*maxfd: 검사 대상이 되는 파일 디스크립터의 수

*readset: fd_set형 변수에 '수신된 데이터의 존재여부'에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.

*writeset: fd_set형 변수에 '블록킹 없는 데이터 전송의 가능여부'에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.

*exceptset: fd_set형 변수에 '에외상황의 발생여부'에 관심이 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.

*timeout: select 함수호출 이후에 무한정 블록킹 상태에 빠지지 않도록 time-out을 설정하기 위한 인자를 전달


*반환값: 오류발생시에는 -1이 반환되고, 타임 아웃에 의한 반환 시에는 0이 반환된다. 그리고 관심대상으로 등록된 파일 디스크립터에 해당 관심에 관련된 변화가 발생하면 0보다 큰 값이 반환되는데, 이 값은 변화가 발생한 파일 디스크립터의 수를 의미한다.


fd_set형 변수에 값을 등록/변경하는 매크로


FD_ZERO(fd_set *fdset) 

 인자로 전달된 주소의 fd_set형 변수의 모든 비트를 0으로 초기화

 FD_SET(int fd, fd_set *fdset)

 매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보를 등록한다.

 FD_CLR(int fd, fd_set *fdset)

 매개변수 fdset으로 전달된 주소의 변수에서 매개변수 fd로 전달된 파일 디스크립터 정보를 삭제한다.

 FD_ISSET(int fd, fd_set *fdset)

 매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보가 있으면 양수를 반환한다.


[윈도우 select 함수]

#include <winsock2.h>


int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *excepfds, const struct timeval *timeout);


*nfds: 검사 대상이 되는 파일 디스크립터의 수

*readfds: fd_set형 변수에 '수신된 데이터의 존재여부'에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.

*writefds: fd_set형 변수에 '블록킹 없는 데이터 전송의 가능여부'에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.

*excepfds: fd_set형 변수에 '에외상황의 발생여부'에 관심이 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.

*timeout: select 함수호출 이후에 무한정 블록킹 상태에 빠지지 않도록 time-out을 설정하기 위한 인자를 전달


*반환값: 오류발생시에는 -1이 반환되고, 타임 아웃에 의한 반환 시에는 0이 반환된다. 그리고 관심대상으로 등록된 파일 디스크립터에 해당 관심에 관련된 변화가 발생하면 0보다 큰 값이 반환되는데, 이 값은 변화가 발생한 파일 디스크립터의 수를 의미한다.


typedef struct timeval

{

        long tv_sec; //seconds

        long tv_usec; //microseconds

}TIMEVAL;

 

typedef struct fd_set

{

        u_int fd_count;

        SOCKET fd_array[FD_SETSIZE];

}fd_set;


[리눅스 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, const void *buf, size_t nbytes, int flags);

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


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

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

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

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


[send & recv 함수의 옵션과 그 의미]

옵션(Option) 

의미 

send 

recv 

 MSG_OOB

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

MSG_PEEK 

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

 

 MSG_DONTROUTE

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

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

 

 MSG_DONTWAIT

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

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

 MSG_WAITALL

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

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

 

 


[리눅스 writev 함수]

#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; //버퍼의 크기 정보

};


[리눅스 readv 함수]

#include <sys/uio.h>

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

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



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

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

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


반응형