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;
}
}
}在这里插入代码片