728x90
728x90
  • close() 함수 호출을 통해 일방적으로 connection을 종료하면 host 사이에 데이터가 정상적으로 도달하지 못한채 종료되는 경우가 발생할 수 있다.
  • 소켓의 스트림은 한쪽 방향으로만 데이터의 이동이 가능하기 때문에 양방향 통신을 위해서는 두개의 스트림이 필요하다.
  • host1의 출력 스트림은 host2의 입력 스트림으로, host 2의 출력 스트림은 host1의 입력 스트림으로 이어진다.

 

[우아한 종료를 위한 shoutdown 함수]

int shutdown(int sock, int howto);

  • sock : 종료할 소켓의 파일 디스크립터 전달
  • howto : 종료 방법에 대한 정보 전달

1. SHUT_RD : 입력 스트림 종료

2. SHUT_WR : 출력 스트림 종료

3. SHUT_RDWR : 입출력 스트림 종료

 

 

[file_client.c]

[file_client.c]

 

 

[터미널 실행 결과]

  • “Thank you” : 클라이언트 -> 서버 (shutdown 함수 호출 후에 read 함수를 이용하여 클라이언트가 보낸 메세지를 받아왔다.
728x90
728x90

[1. TCP : echo_client.c / echo_server.c]

<echo_client.c>

<echo_server.c>

<터미널 실행 결과 화면>

서버

클라이언트

tcp 통신의 한계 : 한개의 server는 multiple client와 동시에 통신할 수 없음.

첫번째 클라이언트와 서버가 통신하고 있고, quit 를 하지 않은 상태에서 두번째 클라이언트가 서버에 메세지를 보내면 다시 send back 되지 않는다. (아직 첫번째 클라이언트와 통신하고 있으므로)

> 첫번째 클라이언트가 q 를 눌러서 통신을 종료하면 즉시 두번째 클라이언트에 아까 보냈던 메세지가 send back 되어서 출력된다.

 

 

[2. UDP : uecho_client.c / uecho_server.c]

<uecho_server.c>

<uecho_client.c>

<UDP — multiple host 와 커넥션>

  • 클라이언트와 서버 역할이 아니라 서로 Host이고 서로 interaction 한다.
  • TCP 에서의 문제가 여기서는 발생하지 않는다. ( connectionless)

 

 

[3. TCP : op_server.c / op_client.c]

  • Really network based application.
  • Remote data processing where a client will be making use of the server

<op_client.c>

<op_server.c>

<터미널 결과>

  • 클라이언트 자체 내에서 계산한 것이 아니라 클라이언트가 서버에 opeartion을 보낸 후 계산된 결과를 받는 network based application 이다.

  • connect 한 다음에 서버쪽에서 ctrl+c로 종료한 다음, 클라이언트에서 opeartion을 수행하면 result 가 0이 나온다. 서버가 응답하지 않았기 때문이다. (trash value)

 

 

[4. UDP : bound_host1.c / bound_host2.c]

  • Host2에서 Host1으로 msg1, msg2, msg 3를 보낸다.
  • Host1에서는 메세지를 받을때마다 5초를 delay 시킨다.

<bound_host1.c>

<bound_host2.c>

  • TCP 방식이었다면 delay 해도 host1에서 msg1,msg2,msg3가 한번에 출력되었을 것이다.(data stream)
  • 그러나 UDP 방식은 Datagram 형식으로 메세지를 보내므로 5초마다 msg1, msg2, msg3 가 차례로 출력된다.

 

728x90

+ Recent posts