프로토콜이란 통신규약으로 데이터를 주고받기 위해 정해놓은 규칙을 말한다. 예를 들어, a가 b에게 사진을 전송한다고 했을 때 메일로 보내는지, 우편으로 보내는지, 메신저로 보내는지, 아니면 b도 모르는 또 다른 매체를 통해서 보내는지 알 수 없다면 b는 그 사진을 전달받을 수 없다. 뿐만 아니라 암호화된 데이터가 어떻게 암호화됐는지 알 수 없다면 데이터를 전달받아도 이것을 해석할 수 없다. 따라서 통신에는 약속이 필요하고 송수신에 있어서 프로토콜을 정의한다는 것은 서로 통신을 하기 위해 필요한 약속을 정하는 것과 같다.
소켓의 타입(type)에는 연결지향형 소켓(SOCK_STREAM) TCP와 비 연결지향형 소켓(SOCK_DGRAM) UDP가 있다. 그 중 TCP의 특징은
비 연결지향형 소켓 UDP의 특징은
a. (UDP) b. (TCP) c. (TCP)
데이터의 신뢰성이 보장되어야 하는 분야에서는 TCP를 사용해야 한다. IP전화나 비디오 스트리밍의 경우 한 두번 끊겨도 대화나 영상의 내용이 바뀌는 것이 아니며, 이런 분야에선 실시간이 중요하기 때문에 UDP가 적합하다.
데이터의 경계가 존재하지 않는 소켓은 TCP이다. 따라서 TCP에서는, 여러 번의 write 함수 호출로 전송된 데이터도 한 번의 read 함수 호출로 수신할 수 있다. 이 반대의 경우도 가능하다. 소켓은 내부적으로 버퍼(buffer)를 가지고 있는데, 소켓을 통해 전송된 데이터는 일단 버퍼에 저장되며, read 함수 호출로 버퍼에서 데이터를 읽어들이고 버퍼가 꽉 차면 송신처에서 데이터를 전송하지 않는다.
tcp_server.c에서 for문을 이용하여 write를 10번 호출한다.
for(i=0;i<10;i++){
write(clnt_sock,message,sizeof(message));
}
tcp_client.c에서 read함수 호출 시기를 늦추기 위해 책에서 주어진 for문 대신에 scanf를 사용하였다.
scanf("%d",&i);
read_len=read(sock,message,sizeof(message));
for(j=0;j<9;j++){
message[13*j+12]='\n';
}
printf("Message from server: %s \n", message);
printf("Function read call count: %d \n",read_len);
중간에 for문을 사용하지 않으면 hello world가 한 줄만 출력된다.
<결과>