본문 바로가기

Daily Report

110629 소켓통신의 흐름 / 소켓의 생성 및 해제 / memset


소켓통신의 흐름

 

2.3 소켓의 생성과 해지

1)Socket생성

   int socket  (int domain,       int type,    int protocol);
   반환값 프로토콜 패밀리  소켓형식   프로토콜

프로토콜 패밀리 ┬ PF_INET : IPv4인터넷
                        ┣ PF_INET6 : IPv6
인터넷 프로토콜 체계

                        └ PF_UNIX :
유닉스

                           ※ PF(
프로토콜 패밀리) ≒ AF(어드레스 패밀리
)
소켓형식 ┬ SOCK_STREAM : TCP형 소켓을 만들겠다
.
               └ SOCK_DGRAM : UDP
형 소켓을 만들겠다
.
프로토콜
┬ IPPROTO_TCP : TCP
               └ IPPROTO_UDP : UDP
반환값성공 : 음수가 아닌 값
(3, 4, 5…)
            └
실패 : –1

예제 int socket(PF_INET, SOCK_STREAM, 0);

소켓형식과 프로토콜은 TCP형이면 TCP, UDP형이면 UDP로 같게 되므로,
소켓형식에 SOCK_STREAM을 넣은 뒤 프로토콜에 0을 넣으면 소켓형식에 맞춰 TCP protocol로 맞춰진다.

2)Socket해제

 

int close(socket);

반환값 -1 에러 나머지는 모두 성공

 

2.4.1범용 주소 형식

16byte

struct sockaddr{

             sa_family_t sa_family;

             char sa_data[14];

};

struct sockaddr{

2byte//주소패밀리(AF_UNIX,AF_INET,AF_INET6()

2byte//ip주소(4byte) + port번호(2byte)

}

 

2.4.2 IPv4주소

16byte 범용주소와 같다

struct sockaddr_in{

             sa_family_t sa_family;

             in_port_t sin_port;

             struct in_addr sin_addr;

char sin_zero[14];

};

struct sockaddr_in{

2byte//주소패밀리

2byte//포트번호

4byte//ip주소

8byte//char[8]

};

 

 

memset(&serv_addr,0,sizeof(serv_addr));

 

memset
메모리를 지정한 문자로 채웁니다.

Declaration
void *memset( void *dest, int c, size_t count )

Return value
성공 - 채워진 메모리 주소(dest 매개 변수) 반환

실패 - 없음


Parameters
dest  -
채울 메모리의 주소

c    -
채울 문자

count -
채우려고 하는 문자 개수


Detail descriptions
memset()
는 버퍼를 똑같은 "문자"로 채울 때 사용합니다. 명확하게 문자라고 표현했듯이 단위는 바이트입니다. memset()는 문자를 저장하는 char 배열뿐만 아니라 모든 종류의 배열에 대해서 사용할 수 있습니다. 그러나, 단위가 바이트이기 때문에 배열 요소의 자료형에 따라 세심한 주의가 필요합니다
.

대부분의 배열은 초기 상태로 0을 갖습니다. 그래서, {} 초기화를 사용해서 모든 요소에 대해 0을 지정하도록 합니다. 그러나, {} 초기화는 배열을 선언할 때 한번만 사용할 수 있고, 이후에는 일일이 모든 요소에 대해 0을 넣어줘야 합니다. 이와 같이 모든 요소를 0으로 채울 때, 배열 종류에 상관없이 사용하는 함수가 memset()입니다