【嵌入式-网络编程】vmware中使用UDP广播失败问题

问题描述:
自己在vmware中搭建了2台虚拟机,虚拟机A向虚拟机A和虚拟机B发送广播信息,接收端在虚拟机A和虚拟机B,这个时候,由于没配置sin.sin_addr.s_addr = htonl(INADDR_ANY);,而是配置的inet_pton(AF_INET, SERV_IP, &sin.sin_addr.s_addr);,导致虚拟机A的广播信号发出去了,但是虚拟机B和虚拟机A完全收不到UDP广播数据。

要点:

  1. 在发送端配置
    // 设置允许广播数据
    int b_br = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &b_br, sizeof(int));
  2. 在接收端配置
    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. 创建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. 绑定服务器
	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个数据
			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. 处理业务

	// 5. 发送数据

	
	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. 创建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. 发送消息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;
}


相关推荐

  1. 嵌入-网络编程vmware使用UDP广播失败问题

    2024-01-09 07:04:04       41 阅读
  2. 嵌入学习——网络编程UDP)——day30

    2024-01-09 07:04:04       9 阅读
  3. 网络UDP编程

    2024-01-09 07:04:04       21 阅读
  4. QT网络编程之实现UDP广播发送和接收

    2024-01-09 07:04:04       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-09 07:04:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-09 07:04:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-09 07:04:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-09 07:04:04       20 阅读

热门阅读

  1. vue中高德地图使用

    2024-01-09 07:04:04       42 阅读
  2. docker的安装使用以及优势

    2024-01-09 07:04:04       31 阅读
  3. Js使用ffmpeg在视频中合成音频背景音乐

    2024-01-09 07:04:04       48 阅读
  4. 详解Nacos和Eureka的区别

    2024-01-09 07:04:04       31 阅读
  5. ffmpeg api-codec-param-test.c源码讲解

    2024-01-09 07:04:04       34 阅读
  6. 数据结构与算法Python版:计数排序

    2024-01-09 07:04:04       39 阅读
  7. 收到的字符串写入xml并且将这个xml写入.zip文件中

    2024-01-09 07:04:04       40 阅读