네트워크 프로그래밍 4주차

Hyun·2024년 10월 15일
0

4.1. 서버-클라이언트 구조

  • HTTP / HTTPS: 대표적인 TCP 프로토콜

  • 핵심 동작

  • 서버 소켓 개수 => 접속한 클라이언트 개수 + 1

4.2. 서버-클라이언트 분석

응용 프로그램 통신을 위해 결정 요소

  • 프로토콜: 통신 규약, 소켓 생성 시 결정
  • 지역 IP 주소, 지역 포트 번호: 서버 또는 클라이언트 자신의 주소
  • 원격 IP 주소, 원격 포트 번호: 서버 또는 클라이언트가 통신하는 상대의 주소

1.1. bind() 함수

: 소켓의 지역 IP 주소, 지역 포트 번호 결정

#include <winsock2.h>
int bind (
	SOCKET sock,
    const struct sockaddr *addr,
    int addrlen
);

사용 예시

retval = bind(listen_sock, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
if (retval == SOCKET_ERROR) err_quit("bind()");

1.2. listen() 함수

: 소켓의 TCP 상태를 LISTENING으로 변경

#include <winsock2.h>
int listen (
	SOCKET sock,
    int backlog
);

사용 예시

retval = listen(liste_sock, SOMAXONN)
if (retval == SOCKET_ERROR) err_quit("listen()")

1.3. accept() 함수

  • 클라이언트 접속 수용, 접속한 클라이언트와 통신할 수 있는 새 소켓 생성하여 리턴
  • 리턴된 소켓으로 접속한 클라이언트의 IP 주소와 포트 번호를 알 수 있음
#include <winsock2.h>
SOCKET accept(
	SOCKET sock, 
    struct sockaddr *addr,
    int *addrlen
);

사용 예시

while (1) {
// accept()
addrlen = sizeof(clientaddr);
client_sock = accept
(listen_sock, (struct sockaddr *)&clientaddr, &addrlen);
if (client_sock == INVALID_SOCKET) {
err_display("accept()");
break;
}

2.1. connect() 함수

: TCP 프로토콜 수준에서 서버와 논리적 연결을 설정

#include <winsock2.h>
int connect (
	SOCKET sock,
    const struct sockaddr *addr,
    int addrlen
);

사용 예시

retval = connect(sock, (struct sockaddr *)&serveraddr, sizeof(serveraddr));

TCP 데이터 전송 함수

  • 기본이 되는 함수는 send(), recv() 함수
  • 윈도우 전용 함수는 WSASend(), WSARecv() 확장 함수

2.2. send() 함수

: 응용 프로그램의 데이터 전송을 위해 운영체제의 송신 버퍼에 데이터를 복사하고 리턴

  • 실제 데이터 전송은 하위 TCP/IP 프로토콜을 통해 전송
  • 쓰레드 측면의 블로킹/넌블로킹 소켓의 동작 (송신 버퍼의 여유공간과 len 비교)
#include <winsock2.h>
int send (
	SOCKET sock,
    const char* buf,
    int len,
    int flags // 옵션 설정 (대부분 0)
);

2.3. recv() 함수

: 운영체제의 수신 버퍼에 도착한 데이터를 응용 프로그램 버퍼에 복사, 리턴

  • 리턴값은 최소 1, 최대 len, 그리고 0인 경우에는 정상 종료
  • MSG_WAITALL => len 크기만큼 수신 버퍼에 도착해서 응용프로그램 버퍼에 복사될 때까지 기다림
  • MSG_PEEK => 수신 버퍼에서 복사한 원본 데이터를 지우지 않음
#include <winsock2.h>
int recv(
	SOCKET sock,
    char *buf,
    int len,
    int flags /// MSG_PEEK or MSG_WAITALL 사용가능 (대부분 0 사용)
);

recv() 함수의 종료

  • 두 종류의 성공적인 리턴
  1. 수신 버퍼에 데이터가 도달한 경우 (1이상의 값)
  2. 접속이 정상 종료한 경우 (0 값을 리턴)
  • 비정상적인 종료시 -1

4.3. TCP 서버-클라이언트(IPv6)

  • 과제 코드 참고

0개의 댓글

관련 채용 정보