6、Tcp类的封装

image.png

#include "CSockLry.h"
using namespace std;
int CSockLry::SendTo(const void* lpBuf, int nBufLen, UINT nHostPort, LPCSTR sIP, int nFlags)
{

	return 0;
}

int CSockLry::ReceiveFrom(void* lpBuf, int nBufLen, LPSTR sIP, UINT* pPort, int nFlags)
{
	return 0;
}

BOOL CSockLry::Accept(CSockLry& socka, LPSTR sIP, PUINT pPort)
{
	sockaddr_in sa{ AF_INET };
	int nLen = sizeof(sa);
	socka.m_hSocket = accept(m_hSocket, (sockaddr*)&sa, &nLen);
	if (sIP)
		InetNtop(AF_INET, &sa.sin_addr, sIP, 16);
	if (pPort)
		*pPort = htons(sa.sin_port);
	return 0;
}

BOOL CSockLry::Connect(LPCSTR lpszHostAddress, UINT nHostPort)
{
	sockaddr_in sa{ AF_INET };
	InetPton(AF_INET, lpszHostAddress, &sa.sin_addr);
	sa.sin_port = htons(nHostPort);

	connect(m_hSocket, (sockaddr*)&sa, sizeof(sa));
	return 0;
}

BOOL CSockLry::Create(UINT nSocketPort, int nSocketType, LPCSTR sIP)
{
	m_hSocket = socket(AF_INET, nSocketType, 0);

	if (m_hSocket == INVALID_SOCKET)
	{
		cout << "句柄创建失败" << endl;
		return FALSE;
	}

	sockaddr_in sa{ AF_INET };
	if (sIP)
		InetPton(AF_INET, sIP, &sa.sin_addr);
	if (nSocketType)
		sa.sin_port = htons(nSocketPort);
	int n = bind(m_hSocket, (sockaddr*)&sa, sizeof(sa));
	if (n)
	{
		cout << "句柄绑定创建失败" << endl;
		return FALSE;
	}
	return true;
}

BOOL CSockLry::GetSocketName(LPSTR sIP, PUINT pPort)
{
	return 0;
}

BOOL CSockLry::GetPeerName(LPSTR sIP, PUINT pPort)
{
	sockaddr_in sa{ AF_INET };
	int nLen = sizeof(sa);
	getpeername(m_hSocket, (sockaddr*)&sa, &nLen);
	if (sIP)
		InetNtop(AF_INET, &sa.sin_addr, sIP, 16);
	if (pPort)
		*pPort = sa.sin_port;
	return 0;
}

#pragma once
#pragma once
#include <Ws2tcpip.h>
#include <iostream>
#include <WinSock2.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);
	}
	static int GetLastError()
	{
		return WSAGetLastError();
	}
	int Receive(void* lpBuf, int nBufLen, int nFlags = 0)
	{
		return recv(m_hSocket, (char*)lpBuf, nBufLen, nFlags);
	}
	BOOL Listen(int backlog = 5)
	{//TCPServer
		return 0 == listen(m_hSocket, backlog);
	}
	int Send(const void* lpBuf, int nBufLen, int nFlags = 0)
	{
		return send(m_hSocket, (char*)lpBuf, nBufLen, nFlags);//write
	}

	int SendTo(const void* lpBuf, int nBufLen, UINT nHostPort, LPCSTR sIP, int nFlags = 0);
	int ReceiveFrom(void* lpBuf, int nBufLen, LPSTR sIP = nullptr, UINT* pPort = nullptr,
		int nFlags = 0);

	BOOL Accept(CSockLry& socka, LPSTR sIP = nullptr, PUINT pPort = nullptr); //SERVER
	BOOL Connect(LPCSTR lpszHostAddress, UINT nHostPort);//CLIENT

	BOOL Create(UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCSTR sIP = nullptr);
	BOOL GetSocketName(LPSTR sIP = nullptr, PUINT pPort = nullptr);//本机IP和端口
	BOOL GetPeerName(LPSTR sIP = nullptr, PUINT pPort = nullptr);//对方IP和端口
	void Close()
	{
		closesocket(m_hSocket);
		m_hSocket = INVALID_SOCKET;
	}
};

#pragma comment(lib,"ws2_32.lib")


#include "CSockLry.h"
#include <process.h>
enum{SERVER_PORT=456};
using namespace std;

void RecvProc(void* p)
{
	CSockLry socka = *(CSockLry*)p;
	char sText[256],sIp[32];
	UINT nPort;
	while (true)
	{
		int n = socka.Receive(sText, sizeof(sText) - 1);
		if (n <= 0)
			cout << "接收失败" << CSockLry::GetLastError() << endl;
		socka.GetPeerName(sIp, &nPort);
		sText[n] = '\0';
		cout << "数据来源IP: " << sIp << " 端口: " << nPort << "---" << sText << endl;
	}
}

int main()
{
	CSockLry sock;
	if (!sock.Create(SERVER_PORT, SOCK_STREAM))
	{
		cout << "创建失败" << CSockLry::GetLastError() << endl;
	}

	sock.Listen();

	while (true)
	{
		CSockLry* pSocka = new CSockLry;
		sock.Accept(*pSocka);
		_beginthread(RecvProc, 0, pSocka);
	}
	return 0;
}
#include "CSockLry.h"
enum { SERVER_PORT = 456 };
using namespace std;
int main()
{
	CSockLry sock;
	sock.Create();
	sock.Connect("127.0.0.1", SERVER_PORT);

	char sText[256];
	while (true)
	{
		cout << "请输入需要传输的数据: ";
		cin >> sText;
		sock.Send(sText, strlen(sText));
	}
	return 0;
}

sock.Create();
sock.Connect(“127.0.0.1”, SERVER_PORT);

char sText[256];
while (true)
{
	cout << "请输入需要传输的数据: ";
	cin >> sText;
	sock.Send(sText, strlen(sText));
}
return 0;

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值