C++网络编程卷1 笔记-2
ACE_SOCK_Acceptor类扮演一个“被动连接端”,可以理解为服务端。
该类是通过factory模式,接受客户端的连接,并在连接建立后初始化ACE_SOCK_Stream对象。ACE_SOCK_Acceptor类的Open方法以正确的次序调用底层的socket(),bind(),listen()函数。
一个例子,实现功能:
1.侦听在80端口,接受客户连接;
2.读取GET请求中的路径名,然后将该文件发送给客户。
3.关闭连接。
4.回到第1步。
#include "ace/Auto_Ptr.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Stream.h"
#include "ace/Mem_Map.h"
// Return a dynamically allocated path name buffer,
extern char *get_url_pathname (ACE_SOCK_Stream * ) ;
int main ()
{
ACE_INET_Addr server_addr;
ACE_SOCK_Acceptor acceptor;
ACE_SOCK_Stream peer;
if (server_addr.set (80) == -1) return 1;
if (acceptor.open (server_addr) == -1) return 1;
for (;;) {
if (acceptor.accept (peer) == -1) return 1;
peer->disable (ACE_NONBLOCK); // Ensure blocking
send_n
auto_ptr
pathname = get_url_pathname (peer); //取得用户请求的文件名
ACE_Mem_Map mapped_file (pathname.get ());
i f (peer.send_n (mapped_file.addr ( ) ,
mapped_file.size ( ) ) == -1) return 1;
peer.close ( ) ;
}
return acceptor.close () = = -1 ? 1 : 0;
}
ACE_Mem_Map实现了“内存映射”文件机制。为不同平台的实现提供统一的接口。
大量客户同时请求时,这个循环式的WEB服务器有很大缺点,可能有多个用户处于等待状态,后面的内容会解决这个问题。
有关ACE_INET_Addr类下次接着聊.
待续...