소켓의 생성과 프로토콜의 설정

2009. 8. 5. 00:14언어/TCP-IP

프로토콜 -> 두 사람이 데이터를 주고 받는 약속 (컴퓨터 상호간의 대화에 필요한 통신규약)

프로토콜은 장 정의 되어야 한다.

 

소켓의 생성 -> 소켓 : 기본적인 통신의 도구(두 개 이상의 호스트를 연결해주는 장치)

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

첫 번째 인자 : 프로토콜 체계

PF_INET

IPv4 인터넷 프로토콜

PF_INET6

IPv6 인터넷 프로토콜

PF_LOCAL

Local 통신을 위한 UNIX 프로토콜

PF_PACKET

Low level socket을 위한 인터페이스

PF_IPX

IPX 노벨 프로토콜

 

두 번째 인자 : 데이터 전송 타입

-> 연결 지향형 : TCP 소켓 =>SOCK_STREAM

특징

  1. 에러나 데이터의 손실 없이 무사히 전달된다.
  2. 전송하는 순서대로 데이터가 전달된다.
  3. 전송되는 데이터의 경계(Boundary)가 존재하지 않는다.

-> 비 연결 지향형 : UDP 소켓 => SOCK_DGRAM

특징

  1. 전송되는 순서에 상관없이 가장 바른 전송을 지향한다.
  2. 전송되는 데이터는 손실될 수 있고 에러가 발생할 수도 있다.
  3. 전송되는 데이터의 경계(Boundary)가 존재한다.
  4. 한번에 전송되는 데이터의 크기는 제한된다.

 

세 번째 인자 : 호스트간에 통신을 하는데 있어서 특정 프로토콜을 지정하기 위해 사용(LOW-SOCKET)

 

예제.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")

 

void ErrorHandling(char *message);

 

int main(int argc, char **argv)

{

    WSADATA wsaData;

    SOCKET hTCPSock;

    SOCKET hUDPSock;

 

    if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0)

        ErrorHandling("WSAStartupp() error!");

 

    /*연결지향TCP 소켓생성*/

    hTCPSock=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    if(hTCPSock == INVALID_SOCKET)

        ErrorHandling("socket() error");

 

    /*비연결지향UDP 소켓생성*/

    hUDPSock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

    if(hUDPSock == INVALID_SOCKET)

        ErrorHandling("socket() error");

 

    printf("생성된TCP 소켓의핸들: %d\n", hTCPSock);

    printf("생성된UDP 소켓의핸들: %d\n", hUDPSock);

 

    closesocket(hTCPSock);

    closesocket(hUDPSock);

 

    WSACleanup();

    return 0;

}

 

void ErrorHandling(char *message)

{

    fputs(message, stderr);

    fputc('\n', stderr);

    exit(1);

}

'언어 > TCP-IP' 카테고리의 다른 글

TCP 기반 서버/클라이언트  (0) 2009.08.06
주소체계와 데이터 정렬  (0) 2009.08.05
네트워크 기초  (0) 2009.07.31