最近有项目使用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; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)