Newlife.Net QA

 

 

 

Q1:当数据包很大时,客户端可以成功发送大的数据包,为什么服务端收到的数据包却被限制为缓冲区的大小64K?

A1:

这里传入的参数SocketAsyncEventArgs实例即e的缓冲区大小为64K,并不是客户端发送的600K,这个缓冲区的大小是由se决定的? 经验证(增大se的缓冲区大小,使它大于发送的数据包大小,则数据包可以正确接收),上述推断正确。

Q2: 有新会话的处理,NewSession的回调问题,NewSession的回调函数被绑定为Server_NewSession,不是会递归调用这个函数,造成死循环?

A2 :这里需要注意的是,虽然Server_NewSession是在NetServer中定义的,NetServer的NewSession委托却并没有被指定为Server_NewSession.例如,对于TCP通信,启动TCPServer进行监听初始化时,会对TCPServer的NewSession绑定,TCPServer继承自ISocektServer,所以TCPSerever的NeSession被绑定为Server_NewSession,而NetServer中的NewSession默认为null,不会造成递归调用,从而形成死循环。

 

梳理一下自定义服务器的实现流程:

 自定义服务器:NetServer<自定义服务器对应的Session> ,通过调用NetServer.Start()函数启动,进一步调用NetServer.OnStart()方法,在此方法中根据协议类型创建了TCP,UDP,IPv4,IPv6的服务器实例(如TCPServer),对服务器实例绑定NewSession事件。对于TCPServer,当收到Accept请求时,创建Session,并触发NewSession,执行上面的函数;对于UPDServer,会直接触发receive。

      处理accept 或者receive是又服务器实例类型决定的,TCPServer和UDPServer的Start函数内容不同。

 

Q3: 

 

       这个事件是在哪里定义的回调函数?具体回调流程处理又是怎样?

A2:

      有两个地方定义了Received事件,一个是服务器的,一个是会话的,注意区分。

     1.服务器(NetServer继承自IServer)

 

  2.会话(INetSession)

 

这个事件回调函数的定义在有新的会话进入时(对TCP是有新的连接,对UDP是收到新的数据包)

可以看到,回调函数被定义为OnReceived,这里是处理的Session的Received。同上,并没有对NetServer定义的Received进行绑定,所以这里的Received为null

这里提供了一个钩子,最后的OnReceive对会话和packet处理可以在自定义服务器中进行处理 。

虽然进行了复杂的绑定,但在TCP通信时,收包事件触发后并没有通过触发OnReceived调用OnReceive,而是直接调用的OnReceive函数

 

posted @ 2019-08-15 16:46  头号程序媛  阅读(211)  评论(0编辑  收藏  举报