티스토리 뷰
---------------클라이언트의 프로세스 -----------------------전화기를 만들고, 커넥트한다. 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));
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번 포트를 목적지로 하는 모든 연결요청에 대해 서버 프로그램이 처리하겠다는 의미.
*/
'Study > 네트워크 실습' 카테고리의 다른 글
다중접속 채팅프로그램 및 Flag를 이용한 1. 실시간 채팅 (닉네임 변경 가능) 2. 더치 페이 기능 (계산기 활용) 3. 미니 게임 기능 (가위바위보 활용) 4. 파일 공유 기능 (파일 전송 활용) (0) | 2019.12.17 |
---|---|
소켓프로그래밍 in c (Linux 환경) 코드분석과 흐름 2 (0) | 2019.11.28 |
패킷트레이서 실습 3-3 (0) | 2019.10.10 |
패킷트레이서 - WAN 환경 구축 (3) | 2019.09.26 |
패킷트레이서 실습 1 (0) | 2019.09.05 |