ACE_SOCK_Acceptor,ACE中面对流(有连接)sock编程的接受器类,将服务器端编程的细节,步骤做了包装,让我们不需要再直接的使用OS的复杂,繁多的API函数,那么这个类中到底替我们做了多少呢?我们该如何修改它呢?
首先看类的构造函数:
ACE_SOCK_Acceptor (void);
ACE_SOCK_Acceptor (const ACE_Addr &local_sap,
int reuse_addr = 0,
int protocol_family = PF_UNSPEC,
int backlog = ACE_DEFAULT_BACKLOG,
int protocol = 0);
ACE_SOCK_Acceptor (const ACE_Addr &local_sap,
ACE_Protocol_Info *protocolinfo,
ACE_SOCK_GROUP g,
u_long flags,
int reuse_addr,
int protocol_family = PF_UNSPEC,
int backlog = ACE_DEFAULT_BACKLOG,
int protocol = 0);
第三个构造函数比第二个多了三个参数,这个构造函数我们不讨论(超复杂,相信你知道真相也会放弃的)。
第一个是无参,不解释。
第二个构造函数,也是重点,它有5个参数,但是后四个都有默认的参数,但是还是解释一下它们的含义。
local_sap:类型是ACE_Addr的引用,不用说了吧,bind()函数的地址参数
reuse_addr:这个参数表示是否打开SO_REUSEPORT这个选项,至于这个选项的含义很长的,这里给你一个链接:http://www.cnblogs.com/mydomain/archive/2011/08/23/2150567.html 讲的很详细。
protocol_family:就是sock函数的第1个参数,地址族,默认就好
backlog:这个是listen()函数的第二个参数,意义就不说了
protocol:sock()函数的第3个参数,这个参数最好不要改,让系统自己确定使用的协议就好,当然默认是TCP
接下来是两个open()函数,这两个函数的参数分别对应两个构造函数,连参数都是一样的,实际上两个构造函数内部就是调用这两个自己对应的open()函数来完成的,当然如果你使用的无参构造函数,那么这个open()函数你还是仔细写一下。
/// Close the socket. Returns 0 on success and -1 on failure.
int close (void);
关闭函数,很简单。
接下来就是两个accept()函数,也是重中之重,第二个不说了,因为它要就在windows中才有可能用到。
int accept (ACE_SOCK_Stream &new_stream,
ACE_Addr *remote_addr = 0,
ACE_Time