Public/tip & tech

[TCP/IP 소켓 프로그래밍] 2. 소켓의 설정과 프로토콜의 설정

quantapia 2009. 8. 14. 10:42

 

2-1 프로토콜 

컴퓨터 상호간의 대화에 필요한 통신 규약

혼돈의 여지가 있으면 안되고 잘 정의(FM)되어야 한다.

※ 안 좋은 예 : 서버에서 accept 하자마자 읽는 연산을 수행.


2-2 소켓의 생성

기본적인 통신 도구

프로토콜에 독립적 : 사용자가 프로토콜을 정해주어야 한다는 점에서...

데이터 전송 형태(타입)를 지정해야 한다.


2-3 프로토콜 체계

#include<sys/types.h>

#include<sys/socket.h>

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

domain : 프로토콜 체계. family

(여러 가지 프로토콜이 합쳐져서 체계를 이룬다.)

PF_INET : IPv4 (4바이트 2^32승개의 IP)

PF_INET6 : IPv6 (16바이트 2^128승개의 IP, 약 10의 38승)

PF_LOCAL : Local 통신을 위한 UNIX 프로토콜

PF_PACKET : Low level socket을 위한 인터페이스

PF_IPX : IPX 노벨 프로토콜

※ 127.0.0.1 : loopback address


2-4 소켓의 타입

type : 형태

1. 연결지향형(connection oriented) 

전송하는 순서대로 데이터가 전달.

에러나 데이터 오류 없이 전달.

전송되는 데이터의 경계가 존재하지 않는다.

 => write함수를 2번호출한다고 해서 read함수가 꼭 2번 호출될 필요가 없다. 


2. 비연결지향형(connectionless)

예시) 우편이면 일반우편, 빠른 우편, 등기 등.

전송되는 순서에 상관없이 가장 빠른 전송.

데이터는 손실되고 에러가 발생할 수도 있다.

데이터의 경계가 존재하고 그 크기는 제한되어 있다.

 => write함수를 2번 호출하면 read함수가 꼭 2번 호출해야 한다.


2-5. 프로토콜의 선택

protocol : 프로토콜을 구체화할 때 필요하다. (raw_socket을 다룰 때 유용하다.)

IPPROTO_TCP : TCP를 기반으로 하는 소켓을 생성. PF_INET + SOCK_STREAM

IPPROTO_UDP : UDP를 기반으로 하는 소켓을 생성. PF_INET + SOCK_DGRAM


※ 파일 핸들도 정수형 데이터이다. 

int a = socket(...); = SOCKET a = socket(...);

앞으로 소켓의 데이터 형이 바뀔 것을 대비해서 SOCKET을 사용하는 것이 좋다.


소켓의 종료

리눅스 

#include<unistd.h>

int close(int filedes);

리턴 : 성공시 0, 실패시 -1

filedes : 닫아줄 파일의 파일 디스크립터


#include<winsock2.h>

int closesocket(SOCKET s);

리턴 : 성공시 0, 실패시 SOCKET_ERROR

s : 닫아줄 소켓의 핸들