전공 수업 내용 정리 (문제 발생시 비공개합니다.)

소켓의 타입과 프로토콜의 설정
프로토콜의 개념
프로토콜은 컴퓨터 간의 데이터 송수신에 필요한 통신 규약으로, 개념적으로는 약속의 의미를 담고 있다. 소켓을 생성할 때 기본적인 프로토콜을 지정해야 한다.
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 |