프로토콜
컴퓨터 상호간의 대화에 필요한 통신규약
소켓의 생성
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
- domain: 소켓이 사용할 프로토콜 체계(Protocol Family) 정보 전달
- type: 소켓의 데이터 전송방식에 대한 정보 전달
- protocol: 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달
프로토콜 체계(Protocol Family)
이름 | 프로토콜 체계(Protocol Family) |
PF_INET | IPv4 인터넷 프로토콜 체계 |
PF_INET6 | IPv6 인터넷 프로토콜 체계 |
PF_LOCAL | 로컬 통신을 위한 UNIX 프로토콜 체계 |
PF_PACKET | Low Level 소켓을 위한 프로토콜 체계 |
PF_IPX | IPX 노벨 프로토콜 체계 |
소켓의 타입(Type)
소켓의 전송 방식을 의미
연결지향형 소켓(SOCK_STREAM)
중간에 데이터가 소멸되지 않고 목적지로 전송
전송 순서대로 데이터가 수신
전송되는 데이터의 경계(Boundary)가 존재하지 않음
신뢰성 있는 순차적인 바이트 기반의 연결지향 데이터 전송 방식의 소켓
비 연결지향형 소켓
전송된 순서에 상관없이 가장 빠른 전송을 지향
전송된 데이터는 손실 또는 파손의 우려가 있음
전송되는 데이터의 경계 존재
한번에 전송할 수 있는 데이터의 크기 제한
신뢰성과 순차적 데이터 전송을 보장하지 않는, 고속의 데이터 전송을 목적으로 하는 소켓
프로토콜의 최종선택
하나의 프로토콜 체계 안에 데이터의 전송방식이 동일한 프로토콜이 둘 이상 존재하는 경우 세 번째 인자를 통해 원하는 프로토콜 정보를 구체화
리눅스 기반 tcp 소켓 예제
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char* message);
int main(int argc, char* argv[]) {
int sock;
struct sockadddr_in serv_addr;
char message[30];
int str_len;
int idx = 0, read_len = 0;
if (argc != 3) {
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
sock = socket(PF_INET, SOCK_STREAM, 0);
if (sock == -1)
error_handling("socket() error");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if (connect(sock, (struct sockaddr*) & serv_addr, sizeof(serv_addr)) == -1)
error_handling("connect() error!");
while (read_len = read(sock, &message[idx++], 1)) {
if (read_len == -1)
error_handling("read() Error!");
str_len += read_len;
}
printf("Message from server : %s \n", message);
printf("Function read call count: %d \n", str_len);
close(sock);
return 0;
}
void error_handling(char* message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
'개인 공부 > 네트워크' 카테고리의 다른 글
[Chapter 03-2] 주소정보의 표현 (0) | 2023.07.20 |
---|---|
[Chapter 02-2] 윈도우 기반에서 이해 및 확인하기 (0) | 2023.07.06 |
[Chapter 01-3] 윈도우 기반으로 구현 (0) | 2023.07.05 |
[Chapter 01-2] 리눅스 기반 파일 조작 (0) | 2023.07.05 |
[Chapter 01-1] 네트워크 프로그래밍과 소켓의 이해 (0) | 2023.07.03 |