소켓의 개설
통신을 하기위해서는 통신에 사용할 프로토콜(TCP 또는 UDP), 자신의 IP, 자신의 PORT, 상대방의 IP, 상대방의 PORT가 필요하다. 우선 소켓 생성부터 알아보기로 한다. 소스는 아래와 같다.
#include <stdio.h>
#include <arpa/inet.h> // 프로토콜 타입 헤더파일
#include <sys/socket.h> // 소켓 헤더 파일
int main()
{
int tcp_sock;
int udp_sock;
/* 연결지향 tcp 소켓 생성 */
tcp_sock=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(tcp_sock == -1)
{
printf("TCP socket error\n");
}
/* 비연결지향 udp 소켓 생성 */
udp_sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(udp_sock == -1)
{
printf("UDP socket error\n");
}
printf("TCP socket : %d \n", tcp_sock);
printf("UDP socket : %d \n", udp_sock);
close(tcp_sock);
close(udp_sock);
return 0;
}
#include <arpa/inet.h> // 프로토콜 타입 헤더파일
#include <sys/socket.h> // 소켓 헤더 파일
int main()
{
int tcp_sock;
int udp_sock;
/* 연결지향 tcp 소켓 생성 */
tcp_sock=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(tcp_sock == -1)
{
printf("TCP socket error\n");
}
/* 비연결지향 udp 소켓 생성 */
udp_sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(udp_sock == -1)
{
printf("UDP socket error\n");
}
printf("TCP socket : %d \n", tcp_sock);
printf("UDP socket : %d \n", udp_sock);
close(tcp_sock);
close(udp_sock);
return 0;
}
소켓의 사용문법은 다음과 같다.
int socket(int domain, int type, int protocol);
domain : 프로토콜 체계
type : 서비스 타입
protocol : 소켓에서 사용할 프로토콜
TCP/IP 프로토콜을 사용하려면 인터넷체계의 소켓을 개설해야하는데 그러기위해서는 domain을
PF_INET으로 지정해주어야한다. domain의 속성은 다음과 같다.
domain : PF_INET (인터넷 프로토콜 체계)
PF_INET6 (IPv6 프로토콜 체계)
PF_UNIX (유닉스 방식 프로토콜 체계)
PF_NS (XEROX 네트워크 시스템 프로토콜 체계)
type은 서비스 타입을 말하며 속성은 다음과 같다.
type : SOCK_STREAM (스트림 방식의 소켓 TCP)
SOCK_DGRAM (데이터그램 방식의 소켓 UDP
SOCK_RAW (RAW 모드의 소켓 생성) tcp나 udp를 거치지않고 바로 ip계층 이용
리눅스에서는 SOCK_PACKET타입을 지원 이는 ip계층도 거치지않고 바로링크 계층 인터페이스 이용
protocol은 구체적인 프로토콜을 선책 대부분 0을 지정
tcp_sock = socket(PF_INET, SOCK_STREAM, 0); << 이렇게해도 똑같음.
int socket(int domain, int type, int protocol);
domain : 프로토콜 체계
type : 서비스 타입
protocol : 소켓에서 사용할 프로토콜
TCP/IP 프로토콜을 사용하려면 인터넷체계의 소켓을 개설해야하는데 그러기위해서는 domain을
PF_INET으로 지정해주어야한다. domain의 속성은 다음과 같다.
domain : PF_INET (인터넷 프로토콜 체계)
PF_INET6 (IPv6 프로토콜 체계)
PF_UNIX (유닉스 방식 프로토콜 체계)
PF_NS (XEROX 네트워크 시스템 프로토콜 체계)
type은 서비스 타입을 말하며 속성은 다음과 같다.
type : SOCK_STREAM (스트림 방식의 소켓 TCP)
SOCK_DGRAM (데이터그램 방식의 소켓 UDP
SOCK_RAW (RAW 모드의 소켓 생성) tcp나 udp를 거치지않고 바로 ip계층 이용
리눅스에서는 SOCK_PACKET타입을 지원 이는 ip계층도 거치지않고 바로링크 계층 인터페이스 이용
protocol은 구체적인 프로토콜을 선책 대부분 0을 지정
tcp_sock = socket(PF_INET, SOCK_STREAM, 0); << 이렇게해도 똑같음.
소켓주소 구조체
소켓의 구체적인 주소를 표현하기위해서는 주소체계, IP 주소, 포트번호 3가지가 지정되어야하며 이 세가지 정보를 소켓 주소라고 부른다. types.h 헤더파일에 설정되어 있으며 소켓 주소의 구조체는 다음과 같다.
struct sockaddr {
u_short sa_family; // 주소체계
char sa_data[14] // 주소
};
액세스 할 수 있는 인터넷 전용 소켓주소 구조체
struct sockaddr_in {
short sin_family; // 주소체계
u_short sin_port; // 16비트 포트번호
struct in_addr sin_addr // 32비트 IP주소
char sin_zero[8]; // 전체 크기를 16바이트로 맞추기 위한 dummy
};
sin_family : AF_INET
AF_UNIX
AF_NS
위의 주소체계는 설명안해도 이제 무엇인지 다 알것이다.
struct sockaddr {
u_short sa_family; // 주소체계
char sa_data[14] // 주소
};
액세스 할 수 있는 인터넷 전용 소켓주소 구조체
struct sockaddr_in {
short sin_family; // 주소체계
u_short sin_port; // 16비트 포트번호
struct in_addr sin_addr // 32비트 IP주소
char sin_zero[8]; // 전체 크기를 16바이트로 맞추기 위한 dummy
};
sin_family : AF_INET
AF_UNIX
AF_NS
위의 주소체계는 설명안해도 이제 무엇인지 다 알것이다.
'네트워크 > 리눅스 기반 강의' 카테고리의 다른 글
2010년 12월 22일 수요일 시그널 함수 (0) | 2010.12.22 |
---|---|
2010년 12월 21일 화요일 소켓 옵션을 변경하는 함수(수업중) (0) | 2010.12.21 |
2010년 12월 21일 화요일 클라이언트 프로그램 작성 절차 (0) | 2010.12.21 |
2010년 12월 15일 수요일 인터넷 주소 변환 & 도메인네임으로 IP주소 알아내기 (0) | 2010.12.15 |
2010년 12월 13일 월요일 (TCP/IP 기초) (0) | 2010.12.13 |