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

+ Recent posts