問題描述:
自己在vmware中搭建了2臺虛擬機,虛擬機A向虛擬機A和虛擬機B發(fā)送廣播信息,接收端在虛擬機A和虛擬機B,這個時候,由于沒配置sin.sin_addr.s_addr = htonl(INADDR_ANY);
,而是配置的inet_pton(AF_INET, SERV_IP, &sin.sin_addr.s_addr);
,導(dǎo)致虛擬機A的廣播信號發(fā)出去了,但是虛擬機B和虛擬機A完全收不到UDP廣播數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-816464.html
要點:文章來源地址http://www.zghlxwxcb.cn/news/detail-816464.html
- 在發(fā)送端配置
// 設(shè)置允許廣播數(shù)據(jù)
int b_br = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &b_br, sizeof(int));- 在接收端配置
sin.sin_addr.s_addr = htonl(INADDR_ANY);綁定到任意接口
// receive.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#define SERV_PORT 5001
#define SERV_IP "192.168.32.133"
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in sin;
struct in_addr sinp;
char buf[BUFSIZ];
// 1. 創(chuàng)建socket
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket");
exit(1);
}
// int b_br = 1;
// setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &b_br, sizeof(int));
// 2. 綁定服務(wù)器
sin.sin_family = AF_INET;
sin.sin_port = htons(SERV_PORT);
// inet_pton(AF_INET, SERV_IP, &sin.sin_addr.s_addr);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(sin.sin_zero, 8);
if(bind(sockfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
perror("bind");
exit(1);
}
// 3. 從客戶端接收
while(1)
{
int recvlen = -1;
struct sockaddr_in srcaddrin;
char srcaddr[16];
int port = -1, addrlen;
recvlen = recvfrom(sockfd, buf, BUFSIZ, 0, (struct sockaddr*)&srcaddrin, &addrlen);
inet_ntop(AF_INET, &srcaddrin.sin_addr.s_addr, srcaddr, sizeof(srcaddrin));
port = ntohs(srcaddrin.sin_port);
if(recvlen == 0) printf("Client (%s:%d) is orderly shutdown\n", srcaddr, port);
else if(recvlen < 0)
{
perror("recvfrom");
break;
}
else {
// 接收到recvlen個數(shù)據(jù)
if(strncasecmp("quit", buf, 4) == 0) break;
printf("Client (%s:%d) recv data len=%d, addrlen=%d from client: %s\n", srcaddr, port, recvlen, addrlen, buf);
}
}
// 4. 處理業(yè)務(wù)
// 5. 發(fā)送數(shù)據(jù)
close(sockfd);
return 0;
}
// sender.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#define SERV_PORT 5001
#define SERV_IP "192.168.32.255"
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in sin;
struct in_addr sinp;
char buf[BUFSIZ];
// 1. 創(chuàng)建socket
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket");
exit(1);
}
// 設(shè)置允許廣播數(shù)據(jù)
int b_br = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &b_br, sizeof(int));
// 2. 發(fā)送消息sendto
sin.sin_family = AF_INET;
sin.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, SERV_IP, &sin.sin_addr.s_addr);
bzero(sin.sin_zero, 8);
while(1)
{
if(fgets(buf, BUFSIZ, stdin) == NULL)
{
perror("fgets");
continue;
}
sendto(sockfd, buf, BUFSIZ, 0, (struct sockaddr *)&sin, sizeof(sin));
if(strncasecmp("quit", buf, 4) == 0) break;
}
close(sockfd);
return 0;
}
到了這里,關(guān)于【嵌入式-網(wǎng)絡(luò)編程】vmware中使用UDP廣播失敗問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!