UDP广播包发送与接收

1、数据发送端

#include "stdafx.h"
#include <WinSock2.h>  
#include <stdio.h>  
#include <iostream>   
using namespace std;

#pragma comment(lib, "ws2_32.lib")   

#define SENDPORT    22222
#define RECVPORT    11111
#define GET_HOST_COMMAND "GetInfor"

int _tmain(int argc, _TCHAR* argv[])
{
	int sockfd;
	WSADATA wsdata;

	/*启动SOCKET库,版本为2.0*/
	WORD    wVer = MAKEWORD(2, 0);
	if (0 != WSAStartup(wVer, &wsdata))
	{
		printf("Not Support Socket2.0!");
		return -1;
	}

	/*socket创建*/
	if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
	{
		printf("socket creater failed!");
		return  -1;
	}

	/*开启广播*/
	int on = 1;
	if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char*)&on, sizeof(on)) < 0)
	{
		printf("setsockopt failed!");
		closesocket(sockfd);
		return -1;
	}

	/*接收地址设定*/
	struct sockaddr_in src_addr;
	memset(&src_addr, 0, sizeof(src_addr));
	src_addr.sin_family = AF_INET;
	src_addr.sin_port = htons(RECVPORT);
	src_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	if (bind(sockfd, (struct sockaddr*)&src_addr, sizeof(src_addr)) < 0)
	{
		printf("bind failed!");
		closesocket(sockfd);
		return -1;
	}

	/*发送数据到广播地址*/
	char sendbuffer[] = "UDP content send Test!";
	struct sockaddr_in dest_addr;
	memset(&dest_addr, 0, sizeof(dest_addr));
	dest_addr.sin_family = AF_INET;
	dest_addr.sin_port = htons(SENDPORT);
	dest_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);

	/*数据接收*/
	char Recvbuffer[128] = { 0 };
	struct sockaddr_in sendaddr;
	int len = sizeof(sendaddr);
	if (recvfrom(sockfd, Recvbuffer, sizeof(Recvbuffer), 0, (struct sockaddr*)&sendaddr, &len) < 0)
	{
		printf("recvfrom failed!");
		closesocket(sockfd);
		return -1;
	}
	printf("接到数据:%s\n", Recvbuffer);

	if (strcmp(Recvbuffer, GET_HOST_COMMAND) == 0)
	{
		/*把数据发往广播地址*/
		for (int i = 0; i < 5; i++)
		{
			if (sendto(sockfd, sendbuffer, sizeof(sendbuffer), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr)) < 0)
			{
				printf("sendto failed!");
				closesocket(sockfd);
				return -1;
			}
			printf("发送数据:%s\n", sendbuffer);
		}
	}
	closesocket(sockfd);

	system("pause");
	return 0;
}

2、遇到问题:

        windows端本机电脑可以接收udp广播包,但是无法发送广播包,最后定位原因为虚拟机网卡导致广播包发送不出去!


版权声明:本文为zx547326zx原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。