파이톨치

[socket programming] 5 iterative echo server 본문

카테고리 없음

[socket programming] 5 iterative echo server

파이톨치 2024. 4. 2. 16:29
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