zoukankan      html  css  js  c++  java
  • 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函数

  • 相关阅读:
    C#读写INI配置文件(转)
    关于DBNull
    XNA项目运行错误:No suitable graphics card found.
    C#3.0新增特性
    Windows 8 Metro开发疑难杂症(三)——导航(2),数据保存,数据虚拟化
    Windows 8 Metro开发疑难杂症(一)——导航
    windows 8 metro 风格开发(7)发布一个常用控件类库
    Windows 8 Metro开发疑难杂症(四)——(伪)数据库
    windows 8 metro 风格开发(9)Interactive(Behavior和EventTrigger)
    Windows 8 Metro开发疑难杂症(六)——APP的挂起状态
  • 原文地址:https://www.cnblogs.com/mbaymax/p/11357614.html
Copyright © 2011-2022 走看看