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版权协议,转载请附上原文出处链接和本声明。