大批量socket连接问题

ttlb 2005-10-21 08:39:36
不停的向某个端口发起连接,当达到一定数量的时候,就会连接不上,netstat -a 里面发现端口已经满了。我觉得是windows在哪个地方限制了连接端口的数量,或者socket端口释放得太慢。哪位大虾知道,Win2000上,这种问题该怎么解决?

import java.io.IOException;
import java.net.Socket;public class SocketTest {
public static void main(String[] args) {
for (int i = 0; i < 9999; ++i) {
try {
Socket socket = new Socket("127.0.0.1", 21);
socket.close();
} catch (IOException ioe) {
System.out.println("Error: " + i);
break;
} catch (Exception e) {
System.out.println("Other Exception: " + i);
return;
}
}
System.out.println("End");
}
}

C++也有同样的问题
...全文
377 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttlb 2005-10-28
  • 打赏
  • 举报
回复
to codearts(代码艺术) : 请问您遇到的问题,是怎么解决的?我能确定我们遇到的问题是 1。
即使是windows客户端,连接unix上的服务器,也还有这个问题,好像不管怎么样,只要连接超过那么多次,可能就不能再连了。
我们的产品没有源代码,所以不能通过修改源代码的方式来解决。
to libin53(红尘摆渡): 我同意你的见解,请问有办法解决没有?
libin53 2005-10-26
  • 打赏
  • 举报
回复
一个机器的端口65535个,你的循环是<9999是执行不完的,在说了,1-1024中的一些端口已经被用了,你也拿不到,虽然服务器在21端口等待客户连接,但客户端也是要开一个端口跟他通信的,如果服务器端打印出客户端连接的socket地址和端口你会发现那些端口是一直增加的,知道机器中的所有端口用完(本机是这样,如果客户端是由很多机器连接到服务器是不会这样的)
snowbirdfly 2005-10-25
  • 打赏
  • 举报
回复
大家知不知道windows的配置对socket连接的影响?
不懂~~
总之,socket应用程序提供了16位操作系统环境和32位的环境~~~
等待高手解释~~~
codearts 2005-10-25
  • 打赏
  • 举报
回复
C#写socket存在的问题是,不知道什么时候socket已经断开了

Socket s(127.0.0.1, 21);
s.Connect();
s.Shutdown(...); //*************
s.Close();
这样的代码,很明显它已经关闭了socket,但是这个本地临时端口还会存在着几分钟,以至于出现楼主所说的情况(也可能我描述的不妥)


总的来说,你最好不要用一个大的for循环来创建大量的socket和线程来发送数据。我以前试着写一个sgip协议的网关,就出现过这个问题。

BTW: 你把客户端和服务器在不同的机器上来测试,看看如何?
codearts 2005-10-25
  • 打赏
  • 举报
回复
关注

我用C#也遇到这样的问题,因为TCP协议是双工的,存在着半关闭的情况,所以在一端关闭socket之后,另一端可能会过几分钟才能知道(甚至不可能知道)。像楼主的代码,就可能存在两种异常:
1.客户端可用的临时端口用完了,不能再分配端口了,就连不上服务器
2.服务器端的问题。不端地向服务器发起连接,服务器承受不了,就会拒绝
ttlb 2005-10-25
  • 打赏
  • 举报
回复
up
ttlb 2005-10-22
  • 打赏
  • 举报
回复
up
ttlb 2005-10-22
  • 打赏
  • 举报
回复
cenlmmx(学海无涯苦作舟) ,wtogether(wtogether): 我这段代码不是真实的程序.我们的东西现在拿不到源代码,只能从其他方面考虑,比如操作系统配置,不过你们的方法我觉得还是可以回去试一下的.谢了.另外,大家知不知道windows的配置对socket连接的影响?我希望能够从操作系统设置的角度找出办法。
cenlmmx 2005-10-21
  • 打赏
  • 举报
回复
try {
Socket socket = new Socket("127.0.0.1", 21);
socket.close();
Thread.getCurrentThread().Sleep(100);
}
试试
wtogether 2005-10-21
  • 打赏
  • 举报
回复
Socket socket = new Socket("127.0.0.1", 21);
socket.close();
socket = null;
zh1369 2005-10-21
  • 打赏
  • 举报
回复
你这是什么东东??

----------------------------
没看明白。
llmsn 2005-10-21
  • 打赏
  • 举报
回复
JAVA不懂呵呵.

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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