以下代码测试通过,可以在win10,xp之间发送和收听广播。不过要注意端口在win10下可能被占用,就要换个端口。广播好像和端口有关的。端口不一样,是无法收听到的。
发送端代码
// 广播发送端.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdlib.h>
//#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<winsock2.h>
#include<windows.h>
#pragma comment (lib, "ws2_32.lib")
int main()
{
SOCKET s;
sockaddr_in addrto;
WSADATA wsdata;
BOOL bsocket;
char *smsg = "this is a test wyj\0";
WSAStartup(0x0202,&wsdata);
s = WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
bsocket = TRUE;
addrto.sin_family = AF_INET;
addrto.sin_addr.s_addr = INADDR_BROADCAST;
addrto.sin_port = htons(5051);
bool opt = true;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,sizeof (opt));
//多网卡要指定在哪个上发
/*
sockaddr_in m_saUdpCli;
m_saUdpCli.sin_family = AF_INET;
m_saUdpCli.sin_addr.s_addr = inet_addr("192.168.0.91");//这个IP就是我选择要发送广播包的网卡的IP
m_saUdpCli.sin_port = htons(1003);
int nResult = bind(s,(SOCKADDR *)&m_saUdpCli,sizeof(SOCKADDR_IN));
*/
int nlen = sizeof (addrto);
while (1)
{
Sleep(1000);
int ret = sendto(s,smsg,strlen(smsg),0,(sockaddr*)&addrto,nlen);
if (ret == SOCKET_ERROR)
printf("Error:%s\n",WSAGetLastError());
else
{
printf("ok");
}
}
return -1;
}
接收端代码
// 广播接收.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdlib.h>
//#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<winsock2.h>
#include<windows.h>
#include <iostream>
#include <Ws2tcpip.h>
#include <process.h> //_beginthread要求
#pragma comment(lib, "ws2_32.lib")
using namespace std;
#pragma comment (lib, "ws2_32.lib")
void main(void)
{
SOCKET s;
sockaddr_in from,a;
WSADATA wsdata;
BOOL optval;
WSAStartup(0x0202,&wsdata);
optval = TRUE;
a.sin_family = AF_INET;
a.sin_addr.s_addr = 0;
a.sin_port = htons(5051);
int fromlength = sizeof (SOCKADDR);
s = socket(AF_INET,SOCK_DGRAM,0);
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof (optval));
//多网卡要指定在哪个上发
/*
sockaddr_in m_saUdpCli;
m_saUdpCli.sin_family = AF_INET;
m_saUdpCli.sin_addr.s_addr = inet_addr("192.168.0.91");//这个IP就是我选择要发送广播包的网卡的IP
m_saUdpCli.sin_port = htons(1003);
int nResult = bind(s,(SOCKADDR *)&m_saUdpCli,sizeof(SOCKADDR_IN));*/
const int loopback = 1; //
int ret = setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,\
(char*)&loopback,sizeof(loopback));
if (ret == SOCKET_ERROR)
{
WSACleanup();
cout << "Error in setsockopt(IP_MULTICAST_LOOP): " << WSAGetLastError() << endl;
}
bind(s,(sockaddr *)&a,sizeof(sockaddr_in));
if (WSAGetLastError() == WSAEADDRINUSE)
{
printf("端口已被占用\n");
}
char buf[256];
memset(buf,0,256);
while (1)
{
recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
Sleep(2000);
printf("%s\n",buf);
printf("may be I receive a stiring\n");
ZeroMemory(buf,256);
}
}