Windows下UDP单播与广播编程

WHUDP.h//头文件

#pragma once
#include <WinSock2.h>
class WHUDP
{
public:
	WHUDP(void);
	~WHUDP(void);

	void ServerInit(int port);
	void SendData(int port);
	void SendData(int port, const char *str);
	void RecvData();
private:
	SOCKADDR_IN m_toAddr;
	SOCKADDR_IN m_fromAddr;
	SOCKET m_sock;
	int m_port;
};

WHUDP.cpp//cpp文件

#include "WHUDP.h"
#include <iostream>
using namespace std;

WHUDP::WHUDP(void)
{
	memset(&m_toAddr,0,sizeof(m_toAddr));
	memset(&m_fromAddr,0,sizeof(m_fromAddr));
}


WHUDP::~WHUDP(void)	
{
	closesocket(m_sock);//关闭Socket
	WSACleanup();//释放WinSocket内部相关资源
}

void WHUDP::ServerInit(int port)
{
	//调用WSAStartup函数:Windows要求启用SOCKET前,必须调用这个函数
	WORD version = MAKEWORD(1, 1);//启用什么版本的SOCKET
	WSADATA wsaData;
	WSAStartup(version, &wsaData);//初始化SOCKET

	//创建SOCKET
	//第一个参数指定SOCKET用哪个协议:AF_INET代表TCP/IP协议簇
	//第二个参数指定SOCKET用协议簇中的哪个具体协议:SOCK_DGRAM代表UDP协议
	//第三个参数在TCP/IP中一般填0
	//TCP/IP协议是一个协议簇(多个协议的集合,包含UDP协议),TCP,IP是两个重要且主要的协议,就以此命名了
	m_sock = socket(AF_INET, SOCK_DGRAM, 0);
	m_port = port;
}

//UDP广播:对局域网内的所有计算机发送消息
void WHUDP::SendData(int port)
{
	memset(&m_toAddr,0,sizeof(m_toAddr));
	//定义IPV4类型的地址结构
	m_toAddr.sin_family        = AF_INET;    //指定结构体使用TCP/IP协议簇
	m_toAddr.sin_port          = htons(port);//类型转换:host to net short
	m_toAddr.sin_addr.s_addr   = htonl(INADDR_BROADCAST); //UDP广播

	bool opt = true;
	int nb=0;
	nb=setsockopt(m_sock,SOL_SOCKET,SO_BROADCAST,(char*)&opt,sizeof(opt));//设置套接字类型
	if(nb==-1)
	{
		cout<<"set socket error...\n"<<endl;
		return;
	}

	while(true)
	{
		char buf[4] = {0};
		scanf("%s", buf);
		int sendLen = sendto(m_sock, buf, strlen(buf), 0, (struct sockaddr *)&m_toAddr, sizeof(m_toAddr));
	}
}

//UDP单播:对局域网内的指定IP的计算机发送消息
void WHUDP::SendData(int port, const char *str)
{
	memset(&m_toAddr,0,sizeof(m_toAddr));
	//定义IPV4类型的地址结构
	m_toAddr.sin_family        = AF_INET;    //指定结构体使用TCP/IP协议簇
	m_toAddr.sin_port          = htons(port);//类型转换:host to net short
	m_toAddr.sin_addr.s_addr   = inet_addr(str);//UDP单播

	while(true)
	{
		char buf[4] = {0};
		scanf("%s", buf);
		int sendLen = sendto(m_sock, buf, strlen(buf), 0, (struct sockaddr *)&m_toAddr, sizeof(m_toAddr));
	}
}

void WHUDP::RecvData()
{
	memset(&m_fromAddr,0,sizeof(m_fromAddr));
	//定义IPV4类型的地址结构
	m_fromAddr.sin_family      = AF_INET;
	m_fromAddr.sin_port        = htons(m_port);
	m_fromAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	//bind函数,成功返回0,失败返回-1
	if (-1 == bind(m_sock, (struct sockaddr*)&m_fromAddr, sizeof(m_fromAddr)))
	{
		cout << "bind出错:" << GetLastError() <<endl;
		return;
	}

	while(true)
	{
		char buf[128] = {0};
		int len = sizeof(m_fromAddr);
		int res = recvfrom(m_sock, buf, sizeof(buf), 0, (struct sockaddr *)&m_fromAddr, &len);
		if(res > 0)
		{
			cout << "接收内容的长度:"  << res << endl;
			cout << "接收内容     : " << buf << endl;	
		}
	}
}

//输出对方IP和端口号port
	while(true)
	{
		char buf[128] = {0};
		int len = sizeof(m_fromAddr);
		int res = recvfrom(m_sock, buf, sizeof(buf), 0, (struct sockaddr *)&m_fromAddr, &len);
		if(res > 0)
		{
			cout << "接收内容的长度:"  << res << endl;
			cout << "接收内容     : " << buf << endl;
			cout << "对方IP地址   : " << inet_ntoa(m_fromAddr.sin_addr) << endl;

			memset(&m_fromAddr,0,sizeof(m_fromAddr));
			if (0 == getsockname(m_sock, (struct sockaddr *)&m_fromAddr, &len))
			{
				cout << "接收端口     : " << ntohs(m_fromAddr.sin_port) << endl;
			}			
		}
	}在这里插入代码片
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮生卍流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值