1、封装udp通讯类
#pragma once
#pragma comment(lib,"Ws2_32.lib")
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <winsock2.h>
#include <Ws2tcpip.h>
class CSockLry
{
SOCKET m_hSocket;
public:
CSockLry() : m_hSocket(INVALID_SOCKET)
{
WSAData wd;
WSAStartup(0x0202, &wd);
}
~CSockLry()
{
if (m_hSocket != INVALID_SOCKET)
closesocket(m_hSocket);
}
int Receive(void* lpBuf, int nBufLen, int nFlags = 0)
{
return recv(m_hSocket, (char*)lpBuf, nBufLen, nFlags);
}
int SendTo(const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR sIP = NULL, int nFlags = 0);
int ReceiveFrom(void* lpBuf, int nBufLen, char* sIP = nullptr, UINT* pPort = nullptr, int nFlags = 0);
static int GetError()
{
return WSAGetLastError();
}
BOOL Create(UINT nSocketPort, int nSocketType = SOCK_STREAM, const char* sIP = nullptr);
};
#include "CSockLry.h"
int CSockLry::SendTo(const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR sIP, int nFlags)
{
return 0;
}
int CSockLry::ReceiveFrom(void* lpBuf, int nBufLen, char* sIP, UINT* pPort, int nFlags)
{
sockaddr_in sa{ AF_INET };
int nLen = sizeof(sa);
int n =recvfrom(m_hSocket, (char*)lpBuf, nBufLen - 1, nFlags, (sockaddr*)&sa, &nLen);
if (n<=0)
{
return n;
}
if (sIP)
InetNtop(AF_INET, &sa.sin_addr, sIP, 16);
if (pPort)
*pPort = htons(sa.sin_port);
return n;
}
BOOL CSockLry::Create(UINT nSocketPort, int nSocketType, const char* sIP)
{
m_hSocket = socket(AF_INET, nSocketType, 0);
if (m_hSocket == INVALID_SOCKET)
{
return -1;
}
sockaddr_in sa{AF_INET,htons(nSocketPort)};
if (sIP)
{
sa.sin_addr.S_un.S_addr = inet_addr(sIP);
}
int n = bind(m_hSocket, (sockaddr*)&sa, sizeof(sa));
if (n)
return -1;
return 0;
}
2、发送端、接收端使用
#include "CSockLry.h"
#include <iostream>
using namespace std;
enum { PORT = 8787 };
int main()
{
CSockLry sock;
int n = sock.Create(0, SOCK_DGRAM);
if (n)
{
cout << "句柄创建失败" << CSockLry::GetError() << endl;
}
char sText[256], sIp[32];
while (true)
{
cout << "请输入需要发送的数据: " ;
cin >> sText;
cout << "请输入需要发送的IP地址: ";
cin >> sIp;
n = sock.SendTo(sText, strlen(sText), PORT, sIp, 0);
if (n <= 0)
{
cout << "发送失败" << CSockLry::GetError() << endl;
}
}
return 0;
}
#include "CSockLry.h"
#include <iostream>
using namespace std;
enum { PORT = 8787 };
int main()
{
CSockLry sock;
int n = sock.Create(PORT, SOCK_DGRAM);
if (n)
{
cout << "句柄创建失败" << CSockLry::GetError() << endl;
}
char sText[256], sIP[32];
UINT nPort{ 0 };
while (true)
{
n = sock.ReceiveFrom(sText, sizeof(sText), sIP, &nPort);
if (n <= 0)
{
cout << "接收失败" << endl;
}
sText[n] = '\0';
cout << "数据来源IP:" << sIP << "--" << nPort << " 内容:" << sText << endl;
}
return 0;
}