EHOzlO 2014. 6. 13. 10:44

80일차









------------------------------------------

TCP/IP 소켓 프로그래밍 기본 정보

------------------------------------------



--- 소켓 프로그래밍

우선 소스를 보자.


// 소켓 생성

iSock = socket(AF_INET, SOCK_STREAM, 0);

if(-1 == iSock)

{

    fprintf(stderr, "소켓을 생성할 수 없습니다.\n");

    return 10;

}


// 소켓 정보 부여

     stAddr.sin_family = AF_INET;

     stAddr.sin_port = htons(4016);

     stAddr.sin_addr = inet_addr("192.168.10.250");








--- socket 함수


-- 원형

#include <sys/types.h>

#include <sys/socket.h>


int socket(int domain, int type, int protocol);





-- description

- domain

AF_UNIX, AF_LOCAL    : 한 시스템 내에 프로그램끼리 통신. 로컬 통신

AF_INET                     : IPv4 인터넷 프로토콜

AF_INET6                    : IPv6 인터넷 프로토콜

.... (등등 몇 가지 더 있음)



- type

SOCK_STREAM    : TCP 통신

SOCK_DGRAM    : UDP 통신

SOCK_RAW    : 저수준에서 프로토콜을 직접 다룰 때 사용

... (등등 몇 가지 더 있음)


- protocol

보통 0을 넣음.

(몇 가지 옵션으로 사용한다는데 아직 뭔지는 잘 모르겠다.)






-- 리턴값

- 성공시 0보다 큰 정수 값.

- 소켓지정번호, socket descriptor라고 부른다.

- 소켓을 지시하여 소켓을 제어한다.





-- sockaddr_in

ip, port 정보를 저장하고 있는 구조체

위치 : /usr/include/linux/in.h


struct sockaddr_in

{

   sa_family_t       sin_family; /* Address family       */

   unsigned short int    sin_port;   /* Port number          */

   struct in_addr    sin_addr;   /* Internet address     */


   /* Pad to size of `struct sockaddr'. */

   unsigned char     __pad[      // 배열

__SOCK_SIZE__

-  sizeof(short int)

sizeof(unsigned short int)

- sizeof(struct in_addr)

];

/* 예전에 이 구조체를 개발할 때 이것 저것 시험용으로 사용하던 것인데

개발이 끝난 후 삭제해야하지 않아서 남은 부분으로 지금은 사용하지 않지만,

이 구조체를 사용할 때 이 영역까지 크기를 계산하여 사용한다.

무슨 파일 제어 관련 구조체가 있는데 이 구조체와 비슷하게 사용하려고???

크기를 같게 만들었다고 한다... 정확히는 모르겠고...

그래서 그 크기만큼 만들어 줘야해서 이 영역은 0으로 채워준다.

*/

};



typedef uint32_t in_addr_t;

struct in_addr

{

in_addr_t s_addr;

};








--- 컴퓨터의 칩에 따라 Big Endian과 Little Endian 이 있는데

통신을 할 때에 칩에 따라 정보가 다르게 해석될 수 있기 때문에

네트워크 통신은 Big Endian으로 통일한다.


--- htons

#include <netinet/in.h>


uint16_t htons(uint16_t hostshort);


호스트 숫자를 네트워크 숫자 형태로 바꿔준다.

Little Endian을 Big Endian으로 바꿔준다는 뜻이다.




--- inet_addr

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>


unsigned long int inet_addr(const char *cp);


"192.168.0.1" 처럼 문자형식 ip 주소를 숫자형식으로 변형해 준다.