250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Python
- 15649
- 1101
- 파이썬
- pyenv
- 개발환경
- 손실함수
- end to end
- Mac
- 신경망 학습
- n과 m
- 가상환경
- 그리디 알고리즘
- streamlit
- 백트래킹
- 백준
- 4948
- 9020
- N-Queen
- 1002
- BOJ
- 재귀
- 실버
- 기계학습
- 경사하강법
- 설정
- 밑바닥부터 시작하는 딥러닝
- 파이싼
Archives
- Today
- Total
파이톨치
[socket programming] 5 iterative echo server 본문
728x90
서버는 한 순간에 하나의 클라이언트와 연결되어 에코 서비스를 제 공한다 (클라이언트가 입력한 메시지를 클라이언트에게 되돌려준 다).
서버는 총 5개의 클라이언트에게 순차적으로 서비스를 제공하고 종 료한다.
클라이언트는 프로그램 사용자로부터 문자열 데이터를 입력받아서 서버에 전송한다.
서버는 전송받은 문자열 데이터를 클라이언트에게 재전송한다. 즉 에코시킨다.
서버와 클라이어트간의 문자열 에코는 클라이언트가 Q 또는 q를 입력할 때까지 계속한다
# iterative echo server
if(listen(serv_sock, 5) == -1)
error_handling("listen() error");
clnt_addr_size = sizeof(clnt_addr);
for(i=0; i<5; i++) {
clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
if (clnt_sock==-1)
error_handling("accept() error");
else
printf("connected client %d \n", i+1);
while((str_len=read(clnt_sock, message, BUF_SIZE)) != 0)
write(clnt_sock, message, str_len);
close(clnt_sock);
}
# iterative echo client
while(1) {
fputs("Input message(Q to quit): ", stdout);
fgets(message, BUF_SIZE, stdin);
if(!strcmp(message, "q\n") || !strcmp(message, "Q\n"))
break;
write(sock, message, strlen(message));
str_len = read(sock, message, BUF_SIZE-1);
message[str_len] = 0; // null, end of string
printf("Message form server: %s", message);
}
HJ
UDP에서는 데이터의 경계가 존재하 므로 5초간의 delay를 삽입해도 총 3 개의 메시지를 3번의 recvfrom 함수 호출을 통해서 수신한다. 만일 TCP 통신이었더라도(recvfrom 은 recv로, sendto는 send로 대체) 3 번 수신했을까요 ?
TCP와 UDP는 데이터 전송 방식에 있어 차이가 있습니다.
UDP의 경우:
- UDP는 데이터그램 기반의 프로토콜로, 각 데이터그램은 독립적으로 전송됩니다.
- 송신자가 보낸 데이터그램의 경계가 수신자에게 그대로 전달됩니다.
- 따라서 UDP에서는 송신자가 보낸 메시지 단위가 수신자에게 그대로 유지되어 전달됩니다.
- 예시처럼 송신자가 3개의 메시지를 보내면, 수신자는 recvfrom을 3번 호출하여 각 메시지를 개별적으로 수신하게 됩니다.
반면 TCP의 경우는 다릅니다:
- TCP는 스트림 기반의 프로토콜로, 데이터의 경계가 없는 바이트 스트림 형태로 전송됩니다.
- 송신자가 보낸 데이터는 하나의 스트림으로 이어져서 수신자에게 전달됩니다.
- 수신자는 recv 함수를 호출할 때마다 스트림에서 지정한 바이트 수 만큼 데이터를 읽어옵니다.
- 송신자가 보낸 데이터의 경계와 상관없이, 수신 버퍼에 도착한 순서대로 데이터를 수신하게 됩니다.
- 따라서 예시처럼 송신자가 3개의 메시지를 보내더라도, 수신자가 3번의 recv 호출로 정확히 3개의 메시지를 구분해서 받는다는 보장이 없습니다.
- TCP에서는 수신자가 충분한 크기의 버퍼로 recv를 호출하면 여러 메시지가 합쳐져서 한 번에 수신될 수도 있습니다.
즉, UDP에서는 송수신되는 데이터의 경계가 보장되지만, TCP에서는 데이터가 스트림 형태로 전송되므로 송수신되는 데이터의 경계는 애플리케이션 레벨에서 직접 구분해야 합니다. 이는 TCP와 UDP 프로토콜의 근본적인 차이점 중 하나입니다.
728x90