티스토리 뷰

네트워크

C socket 프로그래밍 수업 1주차

삼전동해커 2021. 3. 22. 22:46

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함수로 연결을 끊는다.

 

 

'네트워크' 카테고리의 다른 글

라우팅  (0) 2021.03.29
C socket 프로그래밍 수업 1주차 심화  (0) 2021.03.22
IPSEC  (0) 2020.10.16
DNS 쿼리  (0) 2020.10.14
무선 LAN  (0) 2020.10.12
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함