C socket 프로그래밍 수업 1주차
TCP/IP 통신을 구현하는 수업을 들었다.
먼저 server를 먼저 구현해보자.
1.서버에서 먼저 socket()함수를 이용해 외부 클라이언트가 들어 올 수 있는 입구를 만든다.
2.bind 함수를 통해 내 서버의 ip 주소와 포트를 소켓에 할당한다.
3.listen()함수는 외부 클라이언트가 들어오기를 기다리는 단계이다.
4.accept()함수로 클라이언트의 연결을 받아주는 단계이다.
5.read()/write()함수들로 데이터를 주고 받는다.
6.close()함수로 연결을 끊는다.
위 과정을 C로 구현해보자.
1.socket 생성
listenfd 변수를 생성해 socket을 담는다. fd는 파일 디스크립터의 줄임말이다.
AF_INET는 ipv4 버전을 사용하겠다는 의미이다. 대부분 ipv4를 사용하니 고정이라고 생각하자.
SOCK_STREAM은 TCP 버전을 사용하겠다는 의미이다. UDP를 사용하고 싶을 땐 SOCK_DGRAM을 사용하면 된다.
0은 소켓에서 사용할 프로토콜인데
IPPROTO_TCP : TCP
IPPROTO_UDP : UDP
0 : type(SOCK_STREAM or SOCK_DGRAM)에서 정해진 경우.
우린 type에서 정해주었다.
2.bind 함수
sockaddr_in 구조체와 bind함수를 사용한다.
#include<sys/types.h>
#include<sys/socket.h>
헤더를 사용한다.
ip 정보와 포트 정보를 담고 있는 구조체에 대해 알아보자.
2종류의 구조체가 있다. 이 구조체들은 소켓의 통신 대상을 지정하기 위한 주소를 담기 위함이다.
//소켓의 주소를 담는 기본 구조체 역할.
struct sockaddr{
sa_family_t sa_family; //소켓 주소체계(대부분 AF_INET)
char sa_data[14]; //14바이트로 실제 주소 저장을 위함.
}
//sa_family_t가 AF_INET인 경우 사용하는 구조체.
struct sockaddr_in{
sa_family_t sin_family; //소켓 주소체계(AF_INET)
unsigned short int sin_port; //2바이트 포트 주소
struct int_addr sin_addr; //4바이트 IP 주소
unsigned char sin_zero[8]; //사용되지 않는 필드를 0으로 채운다.(dummy.)
}
servaddr 구조체 변수의 sin_family는 AF_INET으로 설정.
servaddr 구조체 변수의 sin_port는 10000으로 설정. htons는
servaddr 구조체 변수의 sin_addr는
bind함수를 보자.
listenfd : 소켓 디스크립터를 의미한다.
(struct sockaddr*)servaddr : 주소 정보를 할당한다. (struct sockaddr*) 형변환을 해주어야 한다.
sizeof(servaddr) : 구조체의 크기를 의미한다.
3.listen함수
int listen(int sockfd,int backlog);
int sockfd : bind함수의 첫번째 인자와 똑같이, 소켓 디스크립터를 의미한다.
int backlog : 연결 대기열의 크기를 지정한다. listen 상태로 얼마나 대기할지를 의미한다.
성공 시 0,실패 시 -1을 리턴한다.
4.accept 함수
클라이언트와 연결하는 함수.
int accept(int sockfd, struct sockaddr *addr,socklen_t *addrlen);
int sockfd : bind함수의 첫번째 인자와 똑같이, 소켓 디스크립터를 의미한다.
NULL : 클라이언트 주소 정보를 담고 있는 구조체.
NULL : 2번째 인자 값의 길이.
5.accept 이 후
write로 client에게 메세지 전달한 후 close함수로 연결을 끊는다.