728x90
UDP의 데이터 송수신
- TCP는 연결이라는 개념이 존재하지만 UDP는 연결의 개념이 존재하지 않음
- 그렇기 때문에 서버 소켓과 클라이언트 소켓의 구분이 없음
- 하나의 소켓으로 둘 이상의 영역과 데이터 송수신 가능
UDP 기반의 데이터 송수신 함수
- sendto : 전송 함수
-> to : 목적지 주소를 담고 있는 구조체 변수
-> addrlen : to에 사용되는 구조체 변수의 크기
- recvto : 수신 함수
-> from : 발신지 주소를 담고 있는 구조체 변수
-> addrlen : from으로 전달된 구조체 변수의 크기
#include <sys/socket.h>
ssize_t sendto(int sock, void *buff, size_t, nbytes, int flags,
struct sockaddr* to, socklent_t addrlen);
ssize_t recvfrom(int sock, void *buff, size_t, nbytes, int flags,
struct sockaddr* from, socklent_t* addrlen);
UDP 기반의 에코 서버 클라이언트
- 서버
int main(int argc, char *argv[])
{
int serv_sock;
char message[BUF_SIZE];
int str_len;
socklen_t clnt_adr_sz;
struct sockaddr_in serv_adr, clnt_adr;
serv_sock=socket(PF_INET, SOCK_DGRAM, 0); // 소켓 생성
if(serv_sock==-1) {
printf("UDP socket creation error");
}
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_adr.sin_port=htons("8080");
if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) {
printf("bind() error");
}
while(1)
{
clnt_adr_sz=sizeof(clnt_adr);
str_len=recvfrom(serv_sock, message, BUF_SIZE, 0,
(struct sockaddr*)&clnt_adr, &clnt_adr_sz);
sendto(serv_sock, message, str_len, 0,
(struct sockaddr*)&clnt_adr, clnt_adr_sz);
}
close(serv_sock);
return 0;
}
- 클라이언트
-> UDP는 데이터의 경계가 존재하기 때문에 보낸 바이트를 체크하여 그만큼 recv하는 작업은 불필요
-> sendto 시 IP와 PORT 정보가 자동으로 할당되기 때문에 주소정보를 할당할 필요가 없음
int main(int argc, char *argv[])
{
int sock;
char message[BUF_SIZE];
int str_len;
socklen_t adr_sz;
struct sockaddr_in serv_adr, from_adr;
sock=socket(PF_INET, SOCK_DGRAM, 0);
if(sock==-1)
error_handling("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");
while(1)
{
fputs("Insert message(q to quit): ", stdout);
fgets(message, sizeof(message), stdin);
if(!strcmp(message,"q\n") || !strcmp(message,"Q\n")) {
break;
}
sendto(sock, message, strlen(message), 0,
(struct sockaddr*)&serv_adr, sizeof(serv_adr));
adr_sz=sizeof(from_adr);
str_len=recvfrom(sock, message, BUF_SIZE, 0,
(struct sockaddr*)&from_adr, &adr_sz);
message[str_len]=0;
printf("Message from server: %s", message);
}
close(sock);
return 0;
}
728x90
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 07-1. TCP 기반의 Half-close (0) | 2021.02.21 |
---|---|
열혈 TCP/IP 06-3. UDP의 데이터 송수신 특성과 UDP에서의 connect 함수호출 (0) | 2021.02.21 |
열혈 TCP/IP 06-1. UDP에 대한 이해 (0) | 2021.02.16 |
열혈 TCP/IP 05-2. TCP의 이론적인 이야기 (0) | 2021.02.14 |
열혈 TCP/IP 05-1. 에코 클라이언트 (0) | 2021.02.14 |