ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20140613 (TCP/IP)
    부산IT학원/스마트컨트롤러 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 주소를 숫자형식으로 변형해 준다.















Designed by Tistory.