728x90
데이터 경계가 존재하는 UDP 소켓
- 데이터 수신을 딜레이를 주고 받아도 한번에 보낸 데이터는 한번에 읽힘
// 송신측
int main()
{
...
sendto(sock, msg1, sizeof(msg1), 0, (struct sockaddr*)&your_adr, sizeof(your_adr));
sendto(sock, msg2, sizeof(msg2), 0, (struct sockaddr*)&your_adr, sizeof(your_adr));
sendto(sock, msg3, sizeof(msg3), 0, (struct sockaddr*)&your_adr, sizeof(your_adr));
}
// 수신 측
int main()
{
...
for(i=0; i<3; i++)
{
sleep(5); // delay 5 sec.
adr_sz=sizeof(your_adr);
str_len=recvfrom(sock, message, BUF_SIZE, 0, (struct sockaddr*)&your_adr, &adr_sz);
printf("Message %d: %s \n", i+1, message);
}
}
connected UDP 소켓
- UDP 소켓은 기본적으로 연결의 개념이 없음
- 데이터를 전송할 때(sendto)의 단계
-> UDP 소켓에 목적지의 IP와 PORT 번호 등록
-> 데이터 전송
-> UDP 소켓에 등록된 목적지 정보 삭제
- 하지만 connected UDP 소켓의 경우 1단계, 3단계를 거치지 않음
- UDP에서의 connect는 TCP처럼 상대방과의 연결은 아니지만 소켓에 목적지 정보를 등록
- 등록되었기 때문에 sendto, recvfrom이 아닌 write, read 함수를 통해 데이터를 송수신 가능
int main()
{
sock=socket(PF_INET, SOCK_DGRAM, 0);
if(sock==-1) {
printf("socket() error");
}
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=inet_addr(INADDR_ANY);
serv_adr.sin_port=htons("8080");
connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr));
while(1)
{
fputs("Insert message(q to quit): ", stdout);
fgets(message, sizeof(message), stdin);
if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))
break;
write(sock, message, strlen(message));
str_len=read(sock, message, sizeof(message)-1);
message[str_len]=0;
printf("Message from server: %s", message);
}
}
728x90
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 08-1. Domain Name System (0) | 2021.02.21 |
---|---|
열혈 TCP/IP 07-1. TCP 기반의 Half-close (0) | 2021.02.21 |
열혈 TCP/IP 06-2. UDP 기반 서버/클라이언트의 구현 (0) | 2021.02.17 |
열혈 TCP/IP 06-1. UDP에 대한 이해 (0) | 2021.02.16 |
열혈 TCP/IP 05-2. TCP의 이론적인 이야기 (0) | 2021.02.14 |