|
like_client.c |
소켓 생성 socket() 지정한 주소로 접속 connect() 서버에서 전송하는 문자열을 받음 read() |
http://synch3d.com/wiki/moin/moin.cgi/Socket |
int socket(int domain, int type, int protocol)
domain값 |
설명 |
PF_UNIX |
유닉스 IPC통신 |
PF_NET |
IPv4 인터넷 프로토콜 |
PF_INET6 |
IPv6 인터넷 프로토콜 |
PF_IPX |
Novell 프로토콜 |
PF_NETLINK |
커널 사용자 인터페이스 드라이버 |
PF_X25 |
ITU-T X.25/ISO-8208 프로토콜 |
PF_AX25 |
아마추어 라디오 AX.25 프로토콜 |
PF_ATMPVC |
처리되지 않은(raw) ATM PVC에 대한 접근 |
PF_APPLETTALK |
AppleTalk? 프로토콜 |
PF_PACKET |
로우 레벨 패킷 인터페이스 |
type값 |
설명 |
SOCK_STREAM |
연결 지향 통신 패킷을 사용 |
SOCK_DGRAM |
비연결 통신 패킷을 사용 |
SOCK_SEQPACKET |
최고 길이가 정해진 연결 지향 통신 |
SOCK_RAW |
처리되지 않은(raw) IP 패킷을 사용 |
SOCK_RDM |
패킷 정렬이 보장되지 않지만 신뢰성이 있는 데이터그램 계층을 사용 |
http://synch3d.com/winsock/SOCKADDR_IN.html |
SOCKADDR_IN
SOCKADDR_IN 구조체는 아래와 같은 형태를 가집니다.
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
SOCKADDR_IN 구조체는 소켓이 접속해 있는 로컬 또는 원격지 주소를 표현하는데 사용됩니다. SOCKADDR_IN 구조체의 길이는 SOCKADDR 구조체의 길이와 동일합니다. 그러나 SOCKADDR_IN 구조체의 데이터 부분에 있는 필드들은 프로그램에 의한 관리가 가능할 정도로 명확하게 선언되어 있습니다. 일반적으로 프로그램은 변수를 SOCKADDR_IN 구조체로서 선언한 다음에 함수 호출 시 변수에 대한 포인터를 SOCKADDR 구조체로 캐스팅 해서 넘기는 방법을 주로 사용하고 있습니다.
Members
sin_family
주소 패밀리 (반드시 AF_INET이여야 합니다)
sin_port
네트웍 바이트 오더로 이루어진 포트 번호
sin_addr
네트웍 바이트 오더로 이루어진 아이피 번호
sin_zero
사용되지 않는 필드이며 0으로 설정될 수 있습니다. SOCKADDR에서 같의 위치의 같은 크기또한 사용하지 않습니다.
Comments
sin_addr 필드는 IN_ADDR 타입의 또 다른 구조체입니다. 프로그램은 IN_ADDR 구조체를 이용하여 IP 어드레스의 각 부분에 접근 할 수 있습니다. IN_ADDR 구조체는 윈도우즈 소켓 헤더 파일인 WINSOCK.H 에 다음과 같이 선언되어 있습니다.
struct in_addr {
union {
struct {
unsigned char s_b1,
s_b2,
s_b3,
s_b4;
} S_un_b;
struct {
unsigned short s_w1,
s_w2;
} S_un_w;
unsigned long S_addr;
} S_un;
};
03. TCP 서버 프로그램 구현
like_server.c |
서버 소켓 생성 socket() bind 함수를 사용해서 서버 소켓의 주소 설정 bind() 위에 지정한 주소로 클라이언트 접속을 기다린 listen() 클라이언트가 접속하면 접속을 허용하고 클라이언트 소켓을 생성함 accept() 클라이언트로 buf에 있는 "I like you!" 문자열 전송 write() |
5장. UDP 서버/클라이언트 프로그래밍
UDP 의 가장 큰 특징은 신뢰성 없는 연결을 제공한다는 것이다. 이 때문에 UDP는 전송중에 데이터가 유실될 수 있는 단점이 있다. 하지만 데이터를 전송하는 방법이 그만큼 간단해지기 때문에 데이터 전송 속도가 빨라지는 장점도 있다.
이 런 UDP의 특징 때문에 UDP 프로그램은 TCP 프로그램과 다른 상황에서 주로 사용된다. 예를 들어, 인터넷 방송과 같이 전송 속도가 빨라야 하고 중간에 프레임 한 두 개 정도는 없어져도 되는 상황에 사용하게 된다. 따라서 UDP는 TCP와 다르기 때문에 소켓 프로그램밍을 할 때 차이점이 생긴다.
01. UDP 프로토콜의 특징과 활용
인 터넷 방송 외에도 네트워크 관리에 사용하는 SNMP(Simple Network Management Protocol) 같은 상위 프로토콜도 UDP를 사용해서 데이터를 전송한다. SNMP는 FTP나 Telnet과 같은 계층에 속하는 프로토콜로서 네트워크를 관리하는 데 주로 사용된다.
02. UDP 클라이언트 프로그램 구현
recvfrom 함수는 UDP 데이터를 수신하는 함수로써 큐에 데이터가 없을 경우에는 데이터가 수신될 때까지 대기 상태로 기다리게 된다.
UDP 클라이언트는 데이터를 송신하기 위해서 소켓을 생성하고 sendto 함수에 서버 주소와 포트번호 등의 정보를 담은 인자를 넘김으로써 UDP 서버에 원하는 데이터를 전송하게 된다.
데이터의 전송을 완료하면 UDP 서버에서 데이터를 받아야 하므로 recvfrom 함수를 호출해서 패킷을 수신한다. 수신된 패킷의 내용을 출력하고 UDP 소켓을 닫아 역시 커널의 자원을 정리한 다음에 프로그램을 종료하게 된다.
[그림 5-4] UDP 서버/클라이언트 프로그램 함수 흐름도
udp_client.c |
socket(); memset(); sendto(); recvfrom(); |
03. UDP 서버 프로그램 구현
udp_server.c |
socket(); memset(); bind(); recvfrom(); sendto(); |
|