ACE 封装TCP服务端

ACE 封装TCP服务端,第1张

ACE 封装TCP服务端

ACE TCP Server
最近有项目使用TCP进行数据发送,但使用Qt内部的TCP总是出现socket被释放与抛出winapi异常的问题,所以改用了ACE并对其进行了一个简单的封装(肯定是没有Qt好用)

.h文件

#pragma once
#ifdef _DEBUG   
#pragma  comment (lib,"ACEd.lib")   
#else   
#pragma  comment (lib,"ACE.lib")   
#endif 
#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Stream.h"
#include "ace/INET_Addr.h"
#include "ace/OS.h"
#include
class AceTcp
{
public:
	AceTcp();
	~AceTcp();
	bool bind(std::string ipAndPort);
	bool listening();
	int write(char * message, int len);
	int read(char * buffer, int len);
	bool close();
	bool islink();
	bool isBind();
private:
	ACE_SOCK_Stream mSocketStream;//socket 数据流
	ACE_INET_Addr mAddr;
	ACE_SOCK_Acceptor  mServer;
	bool mIslink;
	bool mIsBind;
	ACE_Time_Value timeOut;
};



.cpp文件

#include "AceTcp.h"

AceTcp::AceTcp():mIsBind(false),mIslink(false)
{
	timeOut.set_msec(200);
}

AceTcp::~AceTcp()
{
	mServer.close();
	mSocketStream.close();
}

bool AceTcp::listening()
{
	if (mIsBind&&!mIslink)
	{
		int result = mServer.accept(mSocketStream, &mAddr);
		mIslink = result >= 0 ? true : false;
	}
	return mIslink;
	
}

bool AceTcp::bind(std::string ipAndPort)
{
	if (!mIsBind)
	{
		mAddr.string_to_addr(ipAndPort.data());
		int result = mServer.open(mAddr);
		mIsBind = result >= 0 ? true : false;
	}
	return mIsBind;
}

int AceTcp::write(char * message, int len)
{
	if (!mIslink)
		return -1;
	return mSocketStream.send(message, len,&timeOut);
}

int AceTcp::read(char * buffer, int len)
{
	if (!mIslink)
		return -1;
	return mSocketStream.recv(buffer,len,&timeOut);
}

bool AceTcp::close()
{
	if (mIslink)
	{
		int result = mSocketStream.close();
		mIslink = result >= 0 ? false : true;
	}
	return  !mIslink;
}

bool AceTcp::islink()
{
	return mIslink;
}

bool AceTcp::isBind()
{
	return mIsBind;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5702833.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存