首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

TCP卡机有关问题!

2013-04-21 
TCP卡机问题!!Private Sub UserListen_ConnectionRequest(ByVal requestID As Long)寻找空闲的usersockDi

TCP卡机问题!!
Private Sub UserListen_ConnectionRequest(ByVal requestID As Long)
    '寻找空闲的usersock
    Dim Index As Long
    Dim ii As Long
    For Index = 0 To MaxDSClient
        If Index = MaxUserClient Then updata_data = Format(Now, "yy-mm-ss hh:mm:ss") & "→服务器:服务器分配用户的连接已经分配完毕,将不会接受新的用户连接。": updata_serverList
        If Me.UserClient(MaxUserClient).State <> 0 Then updata_data = Format(Now, "yy-mm-ss hh:mm:ss") & "服务器:用户连接超过最大连接数,如果需要创建更多连接请修改系统设置,然后重启服务器。": updata_serverList: Exit Sub
        If UserClient(Index).State = 0 Then
            UserClient(Index).Accept requestID
            UserClient(Index).Tag = Format(Now, "yyyymmddhhmmss")
            For usersock_state = 0 To MaxUserClient
                If UserClient(usersock_state).State <> 0 Then
                    If UserClient(usersock_state).RemoteHostIP = UserClient(Index).RemoteHostIP And UserClient(usersock_state).Tag < UserClient(Index).Tag Then
                        UserClient(usersock_state).Close
                        updata_data = Format(Now, "yy-mm-ss hh:mm:ss") & "→服务器:存在两个连接IP相同的用户,服务器将关闭早期的连接" & "|" & UserClient(Index).RemoteHostIP
                        updata_serverList
                    End If
                End If
            Next
            Exit For
        End If
    Next
    'DoEvents
End Sub
以上为服务器监听代码!我现在碰到原因是在内部光纤的情况下!超过80个TCP客户端同时连接服务器监听端口时软件服务器会出现卡死的状态。请问下是监听端口连接的卡死还是接收客户端信息口的卡机? tcp 服务器
[解决办法]

引用:
真是太蛋疼了!六十多个客户端连接不存在这问题,到八九十个客户端连接一起运行一两天直接挂掉没有任何提示!这情况也只发生在内部通过线路为光纤的情况下!普通的网线却没有出现相应的问题!

这是因为你还没有正真接触过网络服务这种东西,对于专业的网络服务程序而言,对于资源的使用和程序的效率是很讲究的,即使你用VC来开发,纯用 Sock API 和多线程来处理,如果架构和流程没弄好,同样会出现很多问题,特别是抗压力方面表现最为突出,更别说在 VB 里用控件来实现这种过程,抗压力肯定不足,甚至可以说 是完全没有抗压能力,如果不相信你可以用VB写个HTTP代理来看看,就本机访问你的代理去看几个网页,你就会发现VB连反应能力都是差很远的,绝对会丢失很多连接,网页上大部分图片都不会显示出来。

你要知道,WinSock 控件是异步通讯的,也就是靠响应窗口消息来触发事件的,而且控件是有窗口的,你与每一个客户端连接的同时,就会建立一个控件来与其连接,除了控件的COM类和接口也会多一个窗口出来,并且还弄成ActiveX模型,而这个窗口同时还会有相应的处理函数过程,负责接收相关的消息和做出反应,网络消息也是依靠这种窗口来响应的。如果你的电脑同时开八九十窗口,并且每个窗口都还在等待或收发网络数据,对于内存、CPU的开销是多少你可以想像,而且这些过程还不是C语言那种简单的内存概念,还是VB的数据类型处理概念,要知道,VB的数据类型是标准的COM接口类型,就比如数组或String类型,如果在VC里处理这些类型的数据,需要调用专门的API和分配专门的结构体并且要先初始化COM环境才能使用,虽然在VB里使用起来很自然,但正真到了计算机运行,这些复杂的转换过程是漏不掉的,所以会进一步的拖慢程序的运行效率和内存使用量,而且VB程序通常是单线程的,多线程做这种东西根本不现实,难度比用VC写还大。因为除了要用VC Win32 SDK 的开发方案写线程函数过程,还要考虑 VB 数据类型以及相关结构的问题,最主要的还是很多VB本身的语句不能随意使用,因为新线程里没有这些资源供子线程使用,所以用VB写这种东西的多线程,难度比用VC写大很多,而且还不见得稳定。既然多线程不太可行,也就意味着用单线层跑的可能性很大,对于这么多窗口消息、这么多函数过程、这么多变量类型转换过程,系统还要处理别的优先级别更高的进程和线程,你认为这种程序效率会高到哪?从程序跑起来的内存,CPU使用量你就可以看出了,更别说每一个连接的反应能力和反应效率。虽然可以通过更换更高配置的硬件来改善一点这种情况,不过也只是掩耳盗铃的办法,解决不了根本的问题,如果你比较急于解决这种问题,可以给你两个方案:


1、采用我上面说的IIS+ASP+XMLHTTP+VB的方案,有点类似于WEB开发上的AJAX技术来实现这种网络数据交换操作。
2、项目外包,找个有实力的人或公司去弄网络服务这一块,你们自己写客户端。
如果你不急于解决这种问题,你可以慢慢去研究C/C++语言网络服务程序开发这一块,熟悉了基础知识后,去研究架构,然后再开始慢慢实验和慢慢写。
如果你留意一下会发现,在设备管理器里被影藏的项目中,会发现HTTP服务是做了驱动支持的,这就是MS的解决方案,而MS对外的解决方案是IOCP,虽然也不错,不过还是有软肋的,在这一块的架构上,要弄得好,自己还是要去弄过滤驱动的,虽然这种驱动并不难做,但对于搞应用开发的人来说,开始还是很花时间的,所以这一块真要深入,水可以说还是很深的,不会像VB做玩具那么简单,要自己做这块没有个心里准备是不行的。

热点排行