最近有项目使用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" #includeclass 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;
}



