UDP 구현 서버 브로드캐스트

2001 단어 socketUDPTCP/IP
UDP를 사용하여 서버를 작성하여 여러 클라이언트 프로그램을 브로드캐스트합니다.
1. 서버 구축
(1), UDP 포트 생성:
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	
	len = sizeof(cetaddr);
	
	addr.sin_family = AF_INET;
	addr.sin_port = htons(6666);
	addr.sin_addr.s_addr = inet_addr("0");
	
	ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr));
	if(-1 == ret)
	{
		perror("bind");
		exit(-1);
	}

(2) 서버에 연결된 클라이언트와 그 관련 정보를 기록하고 발송자를 제외한 모든 클라이언트에게 메시지 전달
ret = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&cetaddr,&len);
for(i = 0;ntohs(usr[i].sin_port) != 0;i++)
		{
			
			if(usr[i].sin_port == cetaddr.sin_port)
			{
				flag = 1;
				continue;
			}
			else
			{
				others = cetaddr;
				others.sin_port = usr[i].sin_port;
				
				sendto(sockfd,buf,ret,0,(struct sockaddr *)&others,len);
			}
		}
		if(i > 127)
		{
			printf("clinet full
"); } else if(flag == 0) { usr[i] = cetaddr; } else flag = 0; }

2. 클라이언트 코드
void *recv_msg(void *argv)
{
	int sockfd = (int )argv;
	char buf[64];
	
	
	while(1)
	{
		recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);
		printf("recv:%s
",buf); } } int main(int argc,char **argv) { struct sockaddr_in addr,cetaddr; int ret,len; int sockfd = socket(AF_INET,SOCK_DGRAM,0); char buf[128]; pthread_t pid; if(argc < 2) { printf("usage:%s
",argv[0]); exit(-1); } len = sizeof(cetaddr); addr.sin_family = AF_INET; addr.sin_port = htons(6666); addr.sin_addr.s_addr = inet_addr(argv[1]); while(1) { fgets(buf,sizeof(buf),stdin); ret = sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&addr,sizeof(addr)); pthread_create(&pid,NULL,recv_msg,(void *)sockfd); } return 0; }

수신의 실시간성을 확보하기 위해 클라이언트는 서버가 보낸 메시지를 수신하기 위해 새로운 라인을 만들었습니다.
이 코드는 가상 머신의 몇 개의 단말기에서 테스트를 진행하는데 모든 고객 단말기는 먼저 서버에 메시지를 보낸 후에야 다른 고객 단말기에서 보낸 메시지를 받을 수 있고 첫 번째 메시지도 다른 고객 단말기에 동기화되지 않는다.

좋은 웹페이지 즐겨찾기