위 표에서 보이듯이 소켓의 옵션은 계층별로 분류된다. IPPROTO_IP 레벨의 옵션들은 IP프로토콜에 관련되며 IPPROTO_TCP레벨의 옵션은 TCP프로토콜에 관련된 사항이다. SOL_SOCKET옵션들은 소켓에 대한 가장 일반적인 옵션들이다.

 

각각의 옵션을 참조하거나 설정할 때에는 함수를 이용해야 하는데 이떄 이용하는 함수가

 

getsockopt & setsockopt이다.

 

#include<sys/socket.h>에 선언되어 있다.

 

int getscokopt(int sock,int level, int optname, void *optval, socklen_t *optlen);

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

 

sock -> 옵션 확인을 위한 소켓의 디스크립터 전달.

level -> 확인할 옵션의 프로토콜 레벨 전달.

optname -> 확인할 옵션의 이름 전달.

optval -> 확인결과의 저장을 위한 버퍼의 주소값 전달.

optlen -> 네번째 매개변수 optval 로 전달된 주소 값의 버퍼크기를 담고있는 변수의 주소 값 전달, 함수호출이 완료되면 이 변수에는 네번째 인자를 통해 반환된 옵션정보의 크기가 바이트 단위로 계산되어 저장된다.

 

int setsockopt(int sock, int level, int optname, const void* optval, socklen_t optlen);

성공시 0 실패시 -1반환.

 

sock -> 옵션변경을 위한 소켓의 파일 디스크립터 전달.

level -> 변경할 옵션의 프로토콜 레벨 전달.

optname -> 변경할 옵션의 이름 전달.

optval -> 변경할 옵션정보를 저장한 버퍼의 주소 값 전달.

optlen -> 네번째 매개변수 optval로 전달된 옵션정보의 바이트 단위 크기 전달.

 

몇가지 살펴보면, SO_SNDBUF와 SO_RCVBUF는 입출력 버퍼를 제어할 때 사용하는 함수이고, SO_REUSEADDR 함수는 서버측에서 time-wait 상태가 발생하였을떄 이 값을 1(TURE)로 바꾸어 주면 bind error가 뜨지 않고 바로 주소를 재할당해 줄 수가 있다.

또한 TCP소켓에 기본설정으로 Nagle 알고리즘이 설정되어 있는데 이는 때때로 옵션을 풀어줘야 하는 경우가 생긴다. 이때 사용하는 함수가 TCP_NODELAY이다. 이때는 반대로 값을 1로 바꿔 주어야 한다.

 

<Nagle 알고리즘 >

'Programming > Socket' 카테고리의 다른 글

클라이언트 IP 가져오기  (0) 2012.05.14
멀티프로세스 소스  (0) 2012.05.10
멀티프로세스 서버  (0) 2012.05.08
TCP server 함수호출 순서.  (0) 2012.04.25
Socket 함수 구조체  (0) 2012.04.24

 

TCP 서버의 함수호출 순서.

소켓프로그래밍 짜다가 너무 헷갈려서 한번올려본다. 원래는 이런거 올릴생각없었는데 ㅠㅠ

 

함수하나하나 살펴보자.

 

#include<sys/socket.h>에 정의되어 있다.

 

int socket(int domain, int type, int protocol);    //성공시 파일 디스크립터,실패시 -1반환.

 

domain -> 소켓이 사용할 프로토콜 체계(Protocol Family)정보 전달.

type -> 소켓의 데이터 전송방식에 대한 정보 전달.

protocol -> 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달.

 

int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);    //성공시 0,실패시 -1반환.

 

sockfd -> 주소정보를 할당할 소켓의 파일 디스크립터.

myaddr -> 할당하고자 하는 주소정보를 지니는 구조체 변수의 주소 값.

addrlen -> 두 번째 인자로 전달된 구조체 변수의 길이정보.

 

int accept(int sock, struct sockaddr * addr, socklen_t * addrlen);    //성공시 생성된 소켓의 파일 디스크립터, 실패시 -1 반환.

 

sock -> 서버 소켓의 파일 디스크립터 전달.

addr -> 연결요청 한 클라이언트의 주소정보를 담을 변수의 주소 값 전달, 함수호출이 완료되면 인자로 전달된 주소의 변수에는 클라이언트의 주소정보가 채워진다.

addrlen -> 두번째 매개변수 addr에 전달된 주소의 변수 크기를 바이트 단위로 전달, 단 크기정보를 변수에 저장한 다음에 변수의 주소 값을 전달한다. 그리고 함수호출이 완료되면 크기정보로 채워져 있던 변수에는 클라이언트의 주소정보 길이가 바이트 단위로 계산되어 채워진다.

 

int listen(int sockfd, int backlog);    //성공시 0, 실패시 -1반환

 

sockfd -> 서버 소켓의 파일 디스크립터 전달.

backlog -> 연결요청대기큐 허용 갯수 설정하는 정수가 들어감.

 

 

 

'Programming > Socket' 카테고리의 다른 글

클라이언트 IP 가져오기  (0) 2012.05.14
멀티프로세스 소스  (0) 2012.05.10
멀티프로세스 서버  (0) 2012.05.08
소켓의 옵션  (0) 2012.05.07
Socket 함수 구조체  (0) 2012.04.24

Socket Programming을 할때에 소캣을 생성하고 connect ,bind 등등 할때에 소캣에 IP, PORT를 넣어주어야 하는데 이때 미리 선언되어 있는 Socket 구조체에 넣어준다.

 

struct sockaddr_in

{

sa_family_t    sin_family;        //주소체계를 저장함.

uint16_t         sin_port;          //16 비트 TCP/UDP PORT 번호

struct in_addr  sin_addr;        //32비트 IP주소

char            sin_zero[8];      //사용되지 않음.

};

 

struct in_addr

{

in_addr_t    s_addr;        //32비트 IPv4 인터넷 주소

};

 

위의 자료형중에 uint16_t라던지 in_addr_t와 같은 자료형은 POSIX(Portable Operating System Interface)에 나와있는데, POSIX란, 유닉스 계열의 운영체제에 적용하기 위한 표준을 의미한다. 

따로 자료형을 정의해 놓은 이유는 확장성을 고려한 결과이다. int32_t라는 자료형은 이후에 int가 64비트로 표현되는 경우에도 4바이트 자료형임을 보장받을 수 있다. 즉 어떠한 경우에도 int32_t는 4바이트로 표현됨.

 

구조체 멤버 분석

 

sin_family

멤버sin_family에 적용할 주소체계 정보를 저장.

 

 

sin_port

16비트 PORT주소 정보를 저장한다. '네트워크 바이트 순서'대로 저장해야 한다.(빅 에디안)

 

sin_addr

32비트 IP주소 정보를 저장한다.  이역시 빅에디안 순서대로 저장.

 

sin_zero

특별한 의미없음.sockaddr 구조체와 일치시키기 위해 삽입된 멤버.

struct sockaddr{

sa_family_t    sin_family;     //주소체계 저장.

char             sa_data[14]; //주소 정보.

};

 

위의 구조체 멤버 sa_data에 저장되는 주소정보에는 IP주소와 PORT번호가 포함되어야 하고,이 두가지 정보를 담고 남은 부분은 0으로 채울 것을 요구한다.

sockaddr_in에 sin_zero가 존재하는 이유

하지만 이는 주소정보를 담기에 매우 불편한 사항이기 때문에 sockaddr_in이 등장한 것이다.

sockaddr_in구조체 멤버를 채우고 난뒤에 이때 형성되는 구조체 변수의 바이트 열이 요구하는 바이트 열이 되기 때문에 인자전달을 위한 형변환만 시켜주면 바로 요구사항을 채워줄수 있다.

따라서 sockaddr_in에 필요한 정보를 채우고 bind함수를 호출할 때에는 (struct sockaddr *)로 형변환을 시켜주면 간단하게 해결됨.

 

'Programming > Socket' 카테고리의 다른 글

클라이언트 IP 가져오기  (0) 2012.05.14
멀티프로세스 소스  (0) 2012.05.10
멀티프로세스 서버  (0) 2012.05.08
소켓의 옵션  (0) 2012.05.07
TCP server 함수호출 순서.  (0) 2012.04.25

+ Recent posts