ACE的SOCKET包装类
ACE_SOCK_Connector #include "ace/SOCK_Connector.h" 连接
ACE_SOCK_Acceptor #include "ace/SOCK_Acceptor.h" 用于监听
ACE_SOCK_Stream #include "ace/SOCK_Stream.h" 有发送和接受功能
1.iovec response;
peer.recvv(&response);//peer为Stream,可以接收iovec 数组数据,防止泄漏
ACE_INET_Addr #include "ace/INET_Addr.h" 等价于TCP的sockaddr_in
ACE_Time_Value #include "ace/Time_Value.h" 尝试连接时间 ,可用于 Connector , Stream
1.eg:ACE_Time_Value timeout(10);
status.send_n("uptime/n",7,&timeout);//status可以为Connector , Stream
一个ACE的客户端简单例子:
#include <iostream>
#include <conio.h>
#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Connector.h"
#include "ace/Log_Msg.h"
using namespace std;
int main(int ,char *[])
{
ACE_INET_Addr srvr(50000,ACE_LOCALHOST);
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer;
if(connector.connect(peer,srvr)==-1)
{
cout<<"are't connect"<<endl;
getch();
ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT("%p/n"),ACE_TEXT("connect")),1);
}
int bc;
char buf[64];
peer.send_n("uptime/n",7);
bc=peer.recv(buf,sizeof(buf));
write(1,buf,bc);
peer.close();
getch();
return 0;
}
一个ACE服务端例子
#include <iostream>
#include <conio.h>
#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/Time_Value.h"
#include "ace/Log_Msg.h"
using namespace std;
int main(int ,char *[])
{
ACE_INET_Addr port_to_listen(50000,ACE_LOCALHOST);
ACE_SOCK_Acceptor acceptor;
if(acceptor.open(port_to_listen,1)==-1)
{
ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT("%p/n"),ACE_TEXT("acceptor.open")),1);
}
while(1)
{
ACE_SOCK_Stream peer;
ACE_INET_Addr peer_addr;
ACE_Time_Value timeout(10,0);
if(acceptor.accept(peer)==-1)
{
ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT("%p/n"),ACE_TEXT("connect")),1);
}
/*if(acceptor.accept(peer,&peer_addr,&timeout,0)==-1)
{
if(ACE_OS::last_error()==EINTR)
ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%P|%t) interrupted while waiting for connection/n")));
if(ACE_OS::last_error()==ETIMEDOUT)
ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%P|%t) timeout while waiting for connection/n")));
}*/
else
{
ACE_TCHAR peer_name[4096];
peer_addr.addr_to_string(peer_name,4096);
cout<<peer_name<<" connection"<<endl;
char buffer[4096];
ssize_t bytes_received;
while((bytes_received=peer.recv(buffer,sizeof(buffer)))!=-1)
{
peer.send_n(buffer,bytes_received);
}
peer.close();
}
}
return 0;
}
获取错误时可以用ACE_OS::last_error(),也可以用GetLastError(),不过是为了方便移植