2016년 5월 4일 수요일

뇌자극 TCP_IP 프로그래밍 4강 요약

소켓 네트워크 프로그래밍의 흐름

1. 소켓을 만든다. -> socket 함수 사용
2. 클라이언트 : 연결을 시도한다 -> connect 함수 사용
   서버 : 연결을 기다린다. -> accept 함수 사용
3. 소켓으로 통신한다. -> read / write 함수 사용
4. 소켓을 닫는다. -> close 함수 사용

클라이언트와 서버의 프로그램의 흐름

클라이언트
socket() -> connect() -> read()/write() -> close()

connect(): 서버에 연결 시도한다.

서버
socket() -> bind() -> listen() -> accept() -> read()/write() -> close()

bind() : 소켓의 특성을 정의 한다. (프로토콜, IP주소, 포트)
listen() : 여러 클라이언트가 접속 요청할 때 대기열을 지정한다.
accept(): 클라이언트의 연결을 수락한다.

socket 함수
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

domain - AF_UNIX : 시스템 내부에서 프로세스 간의 통신
           - AF_INET : 인터넷 영역에서 컴퓨터 간의 통신(IPv4)
           - AF_INET6 : 인터넷 영역에서 컴퓨터 간의 통신(IPv6)

type - SOCK_STREAM : TCP 기반 통신
       - SOCK_DGRAM : UDP 기반 통신
protocol - IPPROTO_TCP : TCP 프로토콜
            - IPPROTO_DUP : UDP 프로토콜
반환값 - 성공하면 0 이상의 소켓 지정 번호, 실패하면 -1

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

sockfd : socket 함수로 생성된 소켓
my_addr :  IP주소/port 번호를 저장하기 위한 변수가 있는 구조체
addrlen : my_addr의 데이터 크기
반환값 : 성공하면 0, 실패하면 -1

listen 함수
int listen(int sockfd, int backlog)

sockfd : 소켓 지정번호
backlog : 수신 대기열의 크기
반환값: 성공하면 0, 실패하면 -1

accept 함수
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd : 소켓 지정 번호
addr : 클라이언트의 주소와 포트 정보를 구조체에 복사
addrlen : sockaddr 구조체의 크기

connet 함수
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

sockfd : 소켓 지정 번호
serv_addr : 연결할 서버의 IP 주소와 포트등의 정보를 알려주기 위해 사용
addrlen : server_addr의 크기
반환 값 : 연결 성공하면 0, 실패하면 -1

read/write 함수
ssize_t read(int fd, void *buf, size_t count);
ssize_t write (int fd, void *buf, size_t count);

fd : 열린 파일의 파일 지정 번호
buf : 읽기/쓰기 데이터가 저장될 버퍼 변수
count :  읽기/쓰기 데이터의 count 크기
반환값 : 성공하면 읽기/쓰기 데이터의 크기(byte 단위), 실패하면 -1

close 함수
int close(int sockfd);

sockfd : 닫고자 하는 소켓 지정 번호

-윈도우 소켓 프로그래밍-
윈도우는 윈속을 이용해서 소켓 프로그래밍을 한다.
나머지는 다 동일한데 몇 가지만 다르다.

1. 윈속을 사용하기 위해 ws2_32.lib 를 속성에 추가해야 한다
2. WSAStartup 함수를 호출한다.
3. recv 와 send를 통해 데이터 입출력을 해야 한다.
4. closesocket 로 소켓 해제
5. WSACleanup로 WSAStartup 함수 해제

WSAStartup 함수
int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData);

wVersionRequested : 윈속의 버전 (2, 2 를 쓰면 된다.)

recv / send 함수
int recv(SOCKET s, char *buf, int len, int flags);
int send(SOCKET s, char *buf, int len, int flags);

s : 소켓 지정 번호
buf : 읽기/쓰기 데이터가 저장될 버퍼 변수
len : buf의 크기
flags : 소켓 제어를 위한 flags(0을 쓰면 된다)

closesocket 함수
closesocket(SOCKET s);

s: 해체할 소켓의 지정 번호

WSACleanup함수
WSACleanup() : 윈속 함수 끝

댓글 없음:

댓글 쓰기