5、封装udp通讯类

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值