我只会写一个点的n个点winsock能行么?
会不会有什么问题是不是必须用vc+多线程?http://expert.csdn.net/Expert/topic/2653/2653375.xml?temp=.1180994
会不会有什么问题是不是必须用vc+多线程?http://expert.csdn.net/Expert/topic/2653/2653375.xml?temp=.1180994
解决方案 »
- access数据库问题
- 关于VB6的字符串与字节byte之前的相互转换问题。
- 今天没问题提了,也来发个贴
- [急救]日期转换问题(cdate)???
- 顺序添加到数据库中的内容,为何读取时不是顺序读取?
- 数据库中数据连接输出!
- 救命呀,有懂得打印机通讯协议得人么?
- 请问,如何在win2k中编程控制dhcp?也就是接受dhcp server的事件
- 请问,我在一个程序里用CreateObject(word.application)在另一个程序中的创建Word怎么总报“自动化错误”,但相同的代码,如果在同一个
- 调用,API,98好使, XP里面无法关闭计算机!
- 哪里有身份证号对应籍贯的数据库?
- 就200分了也散分!
Dim I As Integer
Winsock1(0).LocalPort = 3333
Winsock1(0).Listen
For I = 1 To Clients
Load Winsock1(I)
Next
End Sub
楼上再帮我看看这个好么:
http://expert.csdn.net/Expert/topic/2663/2663382.xml?temp=.4723932这才是关键的问题,要不然我就算解决了多客户连接也不行
DataArrival事件我怎么判断是哪个client的?
-----------------------
Private Sub Form_Load()
Dim I As Integer
Winsock1(0).LocalPort = 3333
Winsock1(0).Listen
For I = 1 To Clients
Load Winsock1(I)
Next
End Sub
-----------------------你这是预先把所有的sock都Load
我这里可能会有成千上万个client端(当然不是同时),而且程序也需要7x24小时运行但是我看用winsock控件数组的方式
winsock(index) index 为integer型
最大只能有32xxx
但是我这里的连接数是不确定的我如何才能即时的load呢
我试了一下,在没有load winsock(i)之前
是不能判断winsock(i).state的我写的
-------------------------------------
Private Sub tcpServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
intSockNo = intSockNo + 1 'intSockNo初值0
While tcpServer(intSockNo).State <> sckClosed <---会在这里报错:Control array element '1' doesn't exist
intSockNo = intSockNo + 1
If intSockNo > 32000 Then
intSockNo = 1
End If
Wend
Load tcpServer(intSockNo)
tcpServer(intSockNo).Accept requestID
end sub我想让intSockNo++,一直加到integer的上限,然后再从1开始加大家有没有什么好办法阿,别太费资源
服务端最好不用vb写,如果一定要用,可以使用Activex服务器技术,并结合多端口
指派的方法。
我以前写的项目:节点大概有1000个左后,并发的大概有15个左后,按照楼上的传统做法
效率很低(vb不支持真正的多线程),改成Activex,基本可行。
注意:不要考虑用Createthread之类的api去写多线程程序经验之谈。
首先要有一个winsock接受所有client发来的信息。因为你用tcp,就必须的设置remoteport和
localport,因为作为server的接收端口是不可能在不停的变化的。而且你在client最初连接到server的时候也不可能知道一个不停变化着的remoteport。然后要有一个winsock(0).然后如果有连接请求,就load 一个winsock(n).
然后把winsock(n)的设置发送给client,怎么发送,当然也是协议来规定了。
这样就可以用新建的winsock(n)和client建立tcp连接了。如果系统检测到有一个或几个已经建立连接的winsock(n)停止连接了。就是说client走了。
或因为某种原因,连接中断了,那么你就unload winsock(n).我之所以这样做,是为了更合理的利用系统资源。你可以用标志位来标志,序号为n的winsock已经被释放了,也就是说如果又有client请求连接,你又可以load winsock(n)了。怎么检测连接中断呢,用timer足够了。呵呵,这就是大体的思想了。具体的事还要你自己做了。
两个WINSOCK,一个专门侦听,有固定端口号,例如:3000.别一个是WINSOCK数组,参数待设.客户端:
一个WINSOCK.负责连接服务器.过程:
当客户机登录时,向服务器端的固定端口(3000)发送一个请求连接,发送格式自定,服务器端收到该信号后,WINSOCK数组动态生成一个WINSOCK,分配一个未占用的端口号,将该端口号发送回申请的客户机,侦听WINSOCK重新置为侦听状态(为下一个客户提供服务),并将新生成的WINSOCK设置为侦听,客户机收到后,将收到的端口设置为WINSOCK的新端口号,并重新与服务器连接.
该方法可实现一对多功能.类QQ.
winsock(index) index 为integer型
最大只能有32xxx
但是我这里的连接数是不确定的
---------------------------------------
什么?32XXX还不够吗?如果你的服务端真的同时(注意,是同时。)有这么多的连接,那我劝你趁早打消用vb的念头。
但如果你的客户端并非同时连接上来,那么可以在某个客户端连上来的时候,就按顺序(一般是1025-65535)检测端口的状态,如果空闲就分配给它,如果端口忙就检测下一个端口,直到找到空闲的为止。而当客户端的操作完成以后,应该马上把它使用的那个端口关闭置闲,等待下一个客户端的连接。但总的来说,如果客户端一多起来,还是容易出问题。
"当客户机登录时,向服务器端的固定端口(3000)发送一个请求连接,发送格式自定,服务器端收到该信号后,WINSOCK数组动态生成一个WINSOCK,分配一个未占用的端口号,将该端口号发送回申请的客户机,侦听WINSOCK重新置为侦听状态(为下一个客户提供服务),并将新生成的WINSOCK设置为侦听,客户机收到后,将收到的端口设置为WINSOCK的新端口号,并重新与服务器连接.
该方法可实现一对多功能.类QQ."
请问:
QQ中同时有上百万在线人数,服务器中端口号如何划分?(分配一个未占用的端口号,将该端口号发送回申请的客户机)