广播

本文详细介绍了一个简单的UDP广播编程实例,包括发送方如何设置广播选项、创建套接字、指定广播地址和端口,以及接收方如何监听特定端口并解析接收到的数据。通过示例代码展示了如何使用Winsock进行UDP广播通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

广播基本与写udp代码一致;

唯一需要加的代码在发送方:

DWORD bBoard = 1; 是否开启广播
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bBoard, sizeof(bBoard));

其余的代码与udp一样

sender.c

    WSADATA data;
	WSAStartup(MAKEWORD(2, 2), &data);

	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
	SOCKADDR_IN brd_addr;
	memset(&brd_addr, 0, sizeof(brd_addr));
	char ip[16];
	DWORD port = 0;
	puts("input board addr  and port");    //广播地址 , 接收方的端口
	scanf(" %s %d", ip, &port);
	brd_addr.sin_addr.s_addr = inet_addr(ip);
	brd_addr.sin_family = AF_INET;
	brd_addr.sin_port = htons(port);

	DWORD bBoard = 1;

    //开启广播
	setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bBoard, sizeof(bBoard));

	char buf[20] = "im board data";
	for (int i = 0; i < 3; ++i)
	{
		sendto(sock, buf, strlen(buf), 0, (SOCKADDR*)&brd_addr, sizeof(brd_addr));
		Sleep(1000);
	}
	closesocket(sock);
	
	WSACleanup();

 

recver,c

    WSADATA data;
	WSAStartup(MAKEWORD(2, 2), &data);
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);

	unsigned short port = 0;
	puts("input port");

	scanf(" %d", &port);   // udp 端口

	SOCKADDR_IN self_addr , from_addr;
	memset(&self_addr, 0, sizeof(self_addr));
	memset(&from_addr, 0, sizeof(from_addr));
	self_addr.sin_addr.s_addr = INADDR_ANY;
	self_addr.sin_family = AF_INET;
	self_addr.sin_port = htons(port);

    
	if (bind(sock, (SOCKADDR*)&self_addr, sizeof(self_addr) )== SOCKET_ERROR){
		print_error(WSAGetLastError());
		return 0;
	}

	int socklen = sizeof(from_addr);
	char buf[100];
	int n = 0;
	while (1){
		socklen = sizeof(from_addr);
		n = recvfrom(sock, buf, 100, 0, (SOCKADDR*)&from_addr, &socklen);
		if (n < 0){
			print_error(WSAGetLastError());
			break;
		}
		else if (n == 0){
			puts("peer closed");
			break;
		}
		else {
			buf[n] = 0;
			printf("buf:%s , from ip :%s, port:%d\n", buf,
				inet_ntoa(from_addr.sin_addr), ntohs(from_addr.sin_port));
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值