전공 수업 내용 정리 (문제 발생시 비공개합니다.)
소켓의 타입과 프로토콜의 설정
프로토콜의 개념
프로토콜은 컴퓨터 간의 데이터 송수신에 필요한 통신 규약으로, 개념적으로는 약속의 의미를 담고 있다. 소켓을 생성할 때 기본적인 프로토콜을 지정해야 한다.
TCP 서버의 기본적인 함수 호출 순서
- 소켓 생성:
socket()
- 소켓 주소 할당:
bind()
- 연결 요청 대기 상태:
listen()
- 연결 허용:
accept()
- 데이터 송수신:
read()/write()
- 연결 종료:
close()
bind
함수까지 호출이 되면 주소가 할당된 소켓을 얻게 되며, 이후listen
함수를 호출하여 연결 요청을 받을 수 있는 상태로 변환한다.
연결 요청 대기 상태로의 진입
- 연결 요청 대기 상태로 진입하기 위해서는 일반 소켓을 서버 소켓으로 바꾸어 주어야 한다.
#include <sys/types.h>
int listen(int sock, int backlog);
- 매개변수:
sock
: 연결 요청 대기 상태로 두고자 하는 소켓의 파일 디스크립터backlog
: 연결 요청 대기 큐의 크기 정보 (예: 5를 전달하면 5개의 연결 요청을 대기시킬 수 있음)
listen
함수 호출 후, 소켓이 리스닝 소켓이 된다.
클라이언트의 연결 요청 수락
#include <sys/socket.h>
int accept(int sock, struct sockaddr *addr, socklen_t *addrlen);
- 매개변수:
sock
: 서버 소켓의 파일 디스크립터addr
: 연결 요청한 클라이언트의 주소 정보를 담을 변수의 주소값addrlen
: 두 번째 매개변수에 전달된 주소 변수의 크기
accept
함수를 호출하면 클라이언트와의 통신을 위한 별도의 소켓이 추가로 생성된다.
TCP 클라이언트의 기본적인 함수 호출 순서
- 소켓 생성:
socket()
- 연결 요청:
connect()
- 데이터 송수신:
read()/write()
- 연결 종료:
close()
#include <sys/socket.h>
int connect(int sock, const struct sockaddr *servaddr, socklen_t *addrlen);
- 매개변수:
sock
: 클라이언트 소켓의 파일 디스크립터servaddr
: 연결할 서버의 주소 정보addrlen
: 두 번째 매개변수의 크기
TCP 기반 서버와 클라이언트의 함수 호출 관계
- 서버의
listen
함수 호출 이후에야 클라이언트의connect
함수 호출이 유효하다.
이유
- 서버가 연결을 수락할 준비가 되어 있어야 클라이언트가 연결 요청을 보내고, 이를 처리할 수 있기 때문이다.
Iterative 서버의 구현
- 반복적으로
accept
함수를 호출하면 계속해서 클라이언트의 연결 요청을 수락할 수 있다. - 그러나, 동시에 둘 이상의 클라이언트에게 서비스를 제공할 수 있는 모델은 아니다.
에코 클라이언트의 문제점
잘못된 코드 예시:
write(sock, message, strlen(message));
ste_len = read(sock, message, BUF_SIZE - 1);
message[ste_len] = 0;
printf("Message from server: %s", message);
- 잘못된 가정: “한 번의
read
함수 호출로 앞서 전송된 문자열 전체를 읽어들일 수 있다.” - TCP는 데이터의 경계가 존재하지 않기 때문에, 서버가 전송한 문자열의 일부만 읽혀질 수도 있다.
'CS > Network' 카테고리의 다른 글
[네트워크] 클래스 기반 주소 지정 (0) | 2025.01.29 |
---|---|
[네트워크] IP 주소 개요 (0) | 2025.01.29 |
[네트워크] 소켓 프로그래밍 개요 (0) | 2025.01.29 |
[네트워크] TCP 타이머, 옵션 (0) | 2025.01.29 |
[네트워크] TCP segment, control (0) | 2025.01.29 |