티스토리 뷰

---------------클라이언트의 프로세스 -----------------------전화기를 만들고, 커넥트한다. read write , close --------------

 

5개의 함수만 알면된다.

클라이언트의 프로세스

 

 

 

 

STREAM 방식은 IPPROTO_TCP 고정

DGRAM 방식은 IPPROTO_UDP  고정

socket(인터넷망,소캣방식,프로토콜) 

TCP : socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

UDP : socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)

socket 함수 반환 값. ==> 0보다 큰 int 값, 소켓 디스크립터라고 부름 (소켓지정번호)

#include <sys/types.h> 
#include <sys/socket.h>  
int connect(int sockfd, 
            const struct sockaddr *serv_addr, 
            socklen_t addrlen);


struct sockaddr_in serveraddr;

server_sockfd = socket(AF_INET, SOCK_STREAM, 0); //소켓값 반환(디스크립터)
serveraddr.sin_family = AF_INET; // 구조체
serveraddr.sin_addr.s_addr = inet_addr("218.234.19.87"); (ip) //구조체
serveraddr.sin_port = htons(8080);(포트번호) // 구조체

client_len = sizeof(serveraddr); // 구조체의 사이즈
connect(server_sockfd, (struct sockaddr *)&serveraddr, client_len);

 

*The htonl() function converts the unsigned integer from host byte order to network byte order. ?? 알아오기

 

데이터 쓰기

ssize_t write(int fd, const void *buf, size_t count);

int send(int fd, const void *msg, size_t len, int flags); // flags 는 타입의 종류를 지정 잘안쓴다 read write를 많이씀

 

데이터 읽기

ssize_t read(int fd, void *buf, size_t count); //fd == 어떤 전화기 buf == 저장 할 버퍼 count 몇개의 바이트 가져올 것임

int recv(int fd, void *buf, size_t len, int flags);

 

fd : 소켓 지정 번호.

buf : 통신에 사용할 데이터를 가리키는 포인터

count : 통신에 사용할 데이터의 크기 (in bytes).

 

*flags : Specifies the type of message transmission. Values of this argument are formed by logically OR'ing zero or more of the following flags:

 

통신이 끝나면 무조건 close 해줘야한다.

소켓을 닫지 않을 경우 자원 누수 발생

 

close(int sockfd);

closesocket(SOCKET sockfd);

 

 

------------------------------------------------------------------------------------------

기본적인 서버의 흐름 : 소켓을 만들고, IP PORT번호 바인딩, 리슨, 어셉트, 통신, 클로즈

서버의 프로세스

socket() : 소켓 생성

bind() : 소켓을 인터넷 주소와 포트번호로 묶음

listen() : 수신 대기열 생성 (listen queue)

accept() : 연결 대기

read()/write : 데이터 통신

close() : 소켓 닫기

 

bind() : 소켓을 인터넷 주소에 묵어준다 (ip port)

 

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

 

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_addr.s_addr = htonl(INADDR_ANY);

addr.sin_port = htons(8080);

state = bind(sockfd , (struct sockaddr *)&addr, sizeof(addr));

 

버퍼에 차곡차곡 쌓고, 들어온순서부터 accept() 해준다.

 

 

int accept(int s, struct sockaddr *addr, 

         socklen_t *addrlen);

 

서버에 대문소켓이있음(문앞), 버퍼에 있는 데이터는 대문소켓을 통해 들어오고, 들어온 데이터는 다른 소켓과 통신함(1:1)

 

s : 듣기 소켓의 소켓 지정 번호 // 서버는 한개, 클라이언트는 여러개 .. 즉 서버는 듣기소켓한개를 두고, 다른 소켓들이 클라이언트의 소켓과 통신할 수 있게 도와준다. 

addr : 클라이언트의 주소 정보

addrlen : 두번째 매개 변수의 데이터 크기

 

서버와 클라이언트 네트워크 프로그램 흐름

 

실습 : 서버.c

1. 정보들 다 저장

2. 소켓을 만들어서 저장

3. address와 prot번호를 누구한테 받을지 저장 시키고 

4. address와 소켓을 바인딩

5. 리슨 ( 만들었던 소켓이 대문소켓이됨)

6. 들어오면 accept(); // 새로운 소켓생성, 그 소켓과 들어온 클라이언트 소켓 통신

7. write(); (지정한 메세지)

8. close();

 

 

/*

INADDR_ANY 

서버의 ip주소를 자동으로 찾아서 대입해주는 함수

EX) ip 주소는 INADDR_ANY, port num=9000으로 설정할 경우 서버 컴퓨터의 9000번 포트를 목적지로 하는 모든 연결요청에 대해 서버 프로그램이 처리하겠다는 의미.

*/

 

 

댓글
최근에 올라온 글
최근에 달린 댓글
250x250