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;
}
수신의 실시간성을 확보하기 위해 클라이언트는 서버가 보낸 메시지를 수신하기 위해 새로운 라인을 만들었습니다.
이 코드는 가상 머신의 몇 개의 단말기에서 테스트를 진행하는데 모든 고객 단말기는 먼저 서버에 메시지를 보낸 후에야 다른 고객 단말기에서 보낸 메시지를 받을 수 있고 첫 번째 메시지도 다른 고객 단말기에 동기화되지 않는다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React 구성 요소에서 소켓 이벤트 리스너가 여러 번 실행됩니다.기본적이지만 종종 간과되는 사이드 프로젝트를 하면서 배운 것이 있습니다. 이 프로젝트에는 단순히 두 가지 주요 부분이 포함되어 있습니다. 프런트 엔드: 반응 및 재료 UI 백엔드: Express, Typescript...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.