广播通信

// broadcast 广播


// sender

// MulitiBoradCast.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include <WinSock2.h>
#include <stdlib.h>
#pragma comment(lib, "WS2_32.lib")


class CInitSock
{
public:
CInitSock(BYTE minorVer = 2, BYTE majorVer =2);
~CInitSock();
};




CInitSock::CInitSock(BYTE minorVer /* = 2 */, BYTE majorVer /* =2 */)
{
WSADATA wsaData;
WORD sockVersion = MAKEWORD(minorVer, majorVer);
if (::WSAStartup(sockVersion, &wsaData) !=0)
{
exit(0);
}
}


CInitSock::~CInitSock()
{
::WSACleanup();
}


CInitSock initsock;


int _tmain(int argc, _TCHAR* argv[])
{
SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
// 有效 SO_BROADCAST选项
bool bBroadcast = TRUE;

::setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&bBroadcast, sizeof(bool));
// 设置广播地址、这里的广播端口号(电台)是4567
SOCKADDR_IN bcast;
bcast.sin_family = AF_INET;
bcast.sin_addr.s_addr = INADDR_BROADCAST; // ::inet_addr("255.255.255.255")
bcast.sin_port = htons(4567);


// 发送广播
printf("开始向4567端口发送广播数据 .... \n \n");
char sz[] = "This is just a test. \r \n";
while(TRUE)
{
::sendto(s, sz, strlen(sz), 0, (SOCKADDR *)&bcast, sizeof(bcast));
::Sleep(5000);
}


return 0;
}


// author

// recver

// broadcastRecver.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include <WinSock2.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "WS2_32.lib")


class  CInitSock
{
public:
CInitSock(BYTE minorVer = 2, BYTE majorVer = 2);
~CInitSock();
protected:
private:
};


CInitSock::CInitSock(BYTE minorVer /* = 2 */, BYTE majorVer /* = 2 */)
{
WSADATA wsaData;
WORD socketVersion = MAKEWORD(minorVer, majorVer);
if (::WSAStartup(socketVersion, &wsaData) !=0)
{
exit(0);
}
}


CInitSock::~CInitSock()
{
::WSACleanup();
}


CInitSock theSock;


int _tmain(int argc, _TCHAR* argv[])
{
SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);


// 首先要绑定一个本地地址,指明广播端口号
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_addr.S_un.S_addr = INADDR_ANY;
sin.sin_port = ::ntohs(4567);

if (::bind(s, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf( "bind() failed \n");
return 0;
}

// 接收广播
printf("  开始接收4567端口数据......\n\n");
SOCKADDR_IN addRemote;
int nLen = sizeof addRemote;
char sz[256] = { '0'};
while(TRUE)
{
int nRet = ::recvfrom(s, sz, 256, 0,(SOCKADDR*)&addRemote, &nLen);
if (nRet> 0)
{
sz[nRet] = '\0';
printf(sz);
}
}


return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Winsock 是 Windows 操作系统中的一个网络编程接口,可以用于在计算机之间进行通信。在 Winsock 中,广播是一种特殊的通信方式,它允许一台计算机将消息发送给同一局域网中的所有其他计算机。 在 Winsock 中进行广播通信需要以下几个步骤: 1. 创建一个 socket:首先,需要创建一个 socket,使用 Winsock 提供的 API 函数来完成。可以选择使用 UDP 或 TCP 协议,但在广播通信中,UDP 更常见。创建 socket 时需要指定地址族、协议类型和操作方式等参数。 2. 设置广播选项:在创建的 socket 上设置广播选项,以便允许广播发送和接收。可以使用 `setsockopt` 函数来设置 socket 的选项,使用 `SO_BROADCAST` 参数来启用广播功能。 3. 绑定地址和端口:将 socket 绑定到一个本地 IP 地址和端口上,以便可以接收和发送广播消息。在绑定时需要指定广播专用的 IP 地址和端口号。 4. 发送广播消息:使用 `sendto` 函数向指定的广播 IP 地址和端口发送消息。可以根据实际需求自定义消息内容和格式。 5. 接收广播消息:使用 `recvfrom` 函数从绑定的端口接收广播消息。在接收到消息后,可以对消息内容进行处理,并根据需要做出相应的回应。 需要注意的是,广播通信受到网络环境的限制,只能在同一局域网中的计算机之间进行。同时,接收方计算机需要启用广播功能,并正确设置 socket广播选项。广播通信可以用于在局域网中广播消息,例如查找在线设备、通知系统状态变化等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值