Winsock TCP 连接数限制

huangjinsheng726 2009-09-01 05:24:47
听说windows对Tcp/ip连接数有限制(好像只有几十个连接数),我想知道,用VB的winsock控件进行tcp连接,是否会受这个连接数限制的影响?
如不受限制,请问使用该控件可支持多少个Tcp连接.
多谢
...全文
552 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
muma237 2010-06-03
  • 打赏
  • 举报
回复
我们想到的办法是多线程+多服务器 来均衡负载
jessezappy 2009-11-18
  • 打赏
  • 举报
回复
如果不用多线程技术的话,VB普通EXE做出来的服务器不是并发的,不管你有多少个Winsock控件数组都是一样,同一时刻,只可能有一条 .senddata命令在执行。
程序变慢的原因就多了,不单是这个。但是如果连接多了,比如你的3800,那么在3800个连接进行 .senddata 时,就会阻塞在这里,因为发送数据是需要时间等待的。
我之前做了一个就是因为这个阻塞问题才开始考虑用多线程进行操作的,结果现在遇到了另一个头疼的问题,程序已经实现了并发,但是仅有50几个线程同时进行并发操作时,主程序界面就卡死了,而子线程内的.senddata 操作还在继续。。。现在就是要解决这个主界面卡住的问题。。。头疼了。
huangjinsheng726 2009-09-07
  • 打赏
  • 举报
回复
自己写了个连接测试程序,试图连接10000个,可是连接到3800多个的时候机子已经好慢了。。。
呵呵,虽然还不是很清楚连接限制到底是指怎么限制。。。不过算啦,多谢各位的热心帮忙,分给了。
Tiger_Zhao 2009-09-02
  • 打赏
  • 举报
回复
关键看数据量和网络速度,到达某个峰值就会产生拥堵。
huangjinsheng726 2009-09-01
  • 打赏
  • 举报
回复
才几百个而已啊,汗,还以为可以上万个呢.
所谓并发是怎样的?
我是系统通过动态加载winsock对应每个不同的用户的.预计连接的客户端数目可能至少有一千个.
如果只能连几百个,那问题就大了
怎么办?
大熊猫侯佩 2009-09-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 huangjinsheng726 的回复:]
听说windows对Tcp/ip连接数有限制(好像只有几十个连接数),我想知道,用VB的winsock控件进行tcp连接,是否会受这个连接数限制的影响?
如不受限制,请问使用该控件可支持多少个Tcp连接.
多谢
[/Quote]

你的并发数很多么??除非BC,迅雷这种东东,一般不用fix的
倒大霉的上帝 2009-09-01
  • 打赏
  • 举报
回复
我只测试过300个并发用户,再多了我没试过。(因为已经够用了)
理论上时没有的。
chinaboyzyq 2009-09-01
  • 打赏
  • 举报
回复
没限制,看内存大小.

500个以内的连接应该没问题
一、WinSock简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的网络通信应用程序接口之一。20世纪90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等几家公司共同定制了一套标准,即Windows Socket规范,简称WinSock。 VB编写网络程序主要有两种方式:1.winsock控件 2.winsockAPI 二、WinSock控件的使用 1.WinSock控件的主要属性 LocalHostName属性 本地机器名 LocalIP属性 本地机器IP地址 LocalPort属性 本地机器通信程序的端口(0<端口<65536) RemoteHost属性 远程机器名 RemotePort属性 远程机器的通信程序端口 Protocol属性 通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP对应的VB的常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。 SocketHandle属性 返回当前socket连接的句柄,这是只读属性。 RemoteHostIP属性 属性返回远程计算机的IP地址。在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是UDP协议那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。 ByteReceived属性 返回当前接收缓冲区中的字节数 State属性 返回WinSock控件当前的状态 常数 值 描述 sckClosed 0 缺省值,关闭。 SckOpen 1 打开。 SckListening 2 侦听 sckConnectionPending 3 连接挂起 sckResolvingHost 4 识别主机。 sckHostResolved 5 已识别主机 sckConnecting 6 正在连接。 sckConnected 7 已连接。 sckClosing 8 同级人员正在关闭连接。 sckError 9   错误 2.WinSock主要方法 Listen方法 方法用于服务器程序,等待客户访问。格式:Winsock对象.listen Connect方法 用于向远程主机发出连接请求。格式:Winsock对象.connect [远程主机IP,远程端口] Accept方法 用于接受一个连接请求。格式:Winsock对象.accept Request ID Senddata方法 用于发送数据。格式:Winsock对象.senddata 数据 Getdata方法 用来取得接收到的数据。格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]] Close方法 关闭当前连接。格式:Winsock对象.close Bind方法 用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。 Listen方法Listen方法只在使用TCP协议时有用。它将应用程序置于监听检测状态。 Connect方法 当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。Connect方法调用的规范为:Connect RemoteHost,RemotePort Accept方法 当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。 SendData方法当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。 GetData方法 当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。GetData方法调用规范如下:GetData
Winsock程序设计初步之 Winsock编程原理     本课程主要讲Windows中TCP/IP编程接口Winsock,版本为1.1。高版本的Winsock实际与1.1版相差不多,主要是进行了一些扩充,如可超越TCP/IP协议直接用socket来实现IPX、NETBIOS等其它通信协议。   这叙述方便在本文的其余部分中提到的Winsock指的就是Winsock1.1。   通过Winsock可实现点对点或广播通信程序,实际这两者之间的区别不大,编程时其程序流程所用代码几乎相同,不同的地方在于目标地址选择的不同。本课程中所举实例为点对点的形式,并以客户/服务器形式来构建通过Winsock进行通信的点对点通信,并对通信过程的两点分别命名为Server和Client。 为更清楚的说明出Winsock的结构原理,下面以电信局的普通电话服务为比较对象进行说明: 1、电信局提供电话服务类似版主们这的Server,普通电话用户类似版主们这的Client。 2、首先电信局必须建立一个电话总机。这就如果版主们必须在Server端建立一个Socket(套接字),这一步通过调用socket()函数实现。 3、电信局必须给电话总机分配一个号码,以便使用户要拨找该号码得到电话服务,同时接入该电信局的用户必须知道该总机的号码。同样,版主也在Server端也要为这一套接字指定一port(端口),并且要连接该Server的Client必须知道该端口。这一步通过调用bind()函数实现。 4、接下来电信局必须使总机开通并使总机能够高效地监听用户拨号,如果电信局所提供服务的用户数太多,你会发现拨打电信局总机老是忙音,通常电信局内部会使该总机对应的电话号码连到好几个负责交换的处理中心,在一个处理中心忙于处理当前的某个用户时,新到用户可自动转到一下处理中心得到服务。同样版主们的Server端也要使自己的套接口设置成监听状态,这是通用listen()函数实现的,listen()的第二个参数是等待队列数,就如同你可以指定电信局的建立几个负责交换的处理中心。 5、用户知道了电信局的总机号后就可以进行拨打请求得到服务。在Winsock的世界里做为Client端是要先用socket()函数建立一个套接字,然后调connect()函数进行连接。当然和电话一样,如果等待队列数满了、与Server的线路不通或是Server没有提供此项服务时,连接就不会成功。 5、电信局的总机接受了这用户拨打的电话后负责接通用户的线路,而总机本身则再回到等待的状态。Server也是一样,调用accept()函数进入监听处理过程,Server端的代码即在中处暂停,一旦Server端接到申请后系统会建立一个新的套接字来对此连接做服务,而原先的套接字则再回到监听等待的状态。 6、当你电话挂完了,你就可以挂上电话,彼此间也就离线了。Client和Server间的套接字的关闭也是如此;这个关闭离线的动作,可由Client端或Server端劝嬷骰方先关闭。有些电话查询系统不也是如此吗?关闭套接字的函数为 closesocket()。 从以上情况可以看出在服务器端建立一个套接字,并进入实际的监听步骤的过程如下:socket()->bind()->listen()->accept() 那么在accept()完了后,版主们说在Server端将生成一个新的套接字,然后Server将继续进入accept()状态,版主们该如何用这个新的套接字来进行与Client端的通信呢,这就用到了recv()函数,而Client端则是通过send()函数来向服务器发信息的。

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧