银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站之前讲过,socket是一个int的文件描绘符(WinSock中直接是一种抽象的描绘符),银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站通过对这个描绘符发出指令操作socket。这是C言语的思想,正正在面向对象的思想中,最好socket本身是一种对象,种种方法由对象本身发出。用面向对象的思想封装socket并不贫窭,而且,对于描绘socket的意睹可能越发直观,这一节,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站边先容socket和TCP的意睹边对socket进行OO封装。

        起首,每一个socket对象都具有独一的socket文件描绘符,这样可以很好的对应socket的意睹。以是银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站构建一个基类,并让其成为纯虚函数——这是由于socket文件描绘符必须正正在举座的构制中能力显现,然后仍然保存一个返回原始的socket文件描绘符的接口,这是为了不便当归结到类函数中的函数所预留准备的,比如极其浸要的select()银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站会正正在后面讲到,所谓有备无患。

C++代码
  1. class BaseSock{  
  2. protected:  
  3.     int sockFD;  
  4. public:  
  5.     BaseSock();  
  6.     virtual ~BaseSock() = 0;  
  7.     const int& showSockFD() const;  
  8. };  

        函数实现:

C++代码
  1. //class BaseSock  
  2.   
  3. BaseSock::BaseSock():  
  4. sockFD(-1)  
  5. {}  
  6.   
  7. BaseSock::~BaseSock()  
  8. {}  
  9.   
  10. const int& BaseSock::showSockFD() const  
  11. {  
  12.     return sockFD;  
  13. }  

       银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站把sockFD的初始值设置为-1,表明正正在没有派生类构制的时候这是一个非法的文件描绘符号(File Descriptor)。

        接下来,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站简单追忆一下第一节对于TCP Server的建立:

       起首,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站需要建立一个监听socket,然后激活其监听;

        然后,正正在client端结合信歇过来之后,通过监听端口将客户端的信歇传递给新的socket,从而建立通讯socket。

       银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站先构建listen socket:

C++代码
  1. class TCPListenSock: public BaseSock{  
  2. private:  
  3.     sockaddr_in listenSockAddr;  
  4. public:  
  5.     explicit TCPListenSock(unsigned short listen_port);  
  6.     ~TCPListenSock();  
  7.     void TCPListen(  
  8.         int max_connection_requests = 10) const;  
  9. };  

        TCPListenSock建立的目的的就是被动的等待client端寻觅握手的connect(),从而征采client端的sock地址信歇(包含了IP地址和端标语),然后正正在需要的时候传递给新的socket建立通讯socket。

C++代码
  1. TCPListenSock::TCPListenSock(unsigned short listen_port)  
  2. {  
  3.     sockFD = socket(PF_INET,  
  4.                     SOCK_STREAM,  
  5.                     IPPROTO_TCP);  
  6.     if (sockFD < 0) {  
  7.         sockClass::error_info("socket() failed.");  
  8.     }  
  9.     memset(&listenSockAddr, 0, sizeof(listenSockAddr));  
  10.     listenSockAddr.sin_family = AF_INET;  
  11.     listenSockAddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  12.     listenSockAddr.sin_port = htons(listen_port);  
  13.     if (bind(    sockFD,  
  14.                 (sockaddr*)&listenSockAddr,  
  15.                 sizeof(listenSockAddr)) < 0) {  
  16.         sockClass::error_info("bind() failed.");  
  17.     }  
  18. }  
  19.   
  20. TCPListenSock::~TCPListenSock()  
  21. {  
  22.     close(sockFD);  
  23. }  

       TCPListenSock通过调用socket()建立sockFD;通过指定端口好指明监听端口,这是为客户端可以找到这个端口所必须的。而IP地址设置为INADDR_ANY,其实就是0,这意味着可以是任何一个server端所具有的IP。TCPListenSock通过bind()将sockFD和SockAddr绑定正正在一起。这个sockFD只有本机的SockAddr意味着:1、无法建立结合,只有授与数据报;2、只可授与信歇,由于没有长途目的地的SockAddr而无法发出信歇。

       而这对于TPC建立结合的历程来说,既是足够的,也是必须的。实情上,client端发出的第一个握手数据报就被这个sockFD所接收,而返回给client的握手应答和对client的握手请求则由新的sockFD发出。

       listen()是将TCPListenSock激活为监听状态,如果不激活,那么任何握手的结合请求都将被这个sockFD所忽略。

C++代码
  1. void TCPListenSock::TCPListen(  
  2.                         int max_connection_requests) const  
  3. {  
  4.     if (listen(    sockFD,  
  5.                 max_connection_requests) < 0) {  
  6.         sockClass::error_info("listen() failed.");  
  7.     }  
  8. }  

       这个函数看来似乎有些节外生枝,由于这个监听是可以整合到构制函数中的,也就是说,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站可以一朝建立TCPListenSock就令其激活,实情上这正是SDL_net中的做法,也是让我觉得不稹密的地方,由于监听本身是socket的一个意睹。

除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.sygjbus.cn/software/425.html
2015年9月10日
作家:鸡啄米 分类:软件开发 浏览: 评论:0