紧急求救: socket连接问题

leskey 2014-08-27 03:36:48
我在电脑A上面,有个程序Program-A开了个Sokcet 端口:
IPEndPoint ipe = null;
Socket _socket = null;
Socket _handler = null;
string _ip = "192.168.1.11";
int _port = 28001
ipe = new IPEndPoint(IPAddress.Parse(_ip), _port);
_socket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
_socket.Bind(ipe);
_socket.Listen(1);
_handler =_socket.Accept();

Program-A每隔一段时间需要接另外2个程序(B和C)发过来的信息(另外2个程序保证同时只有一个连接program-A)
program -A收到B或者C的结束Message后,会执行
_handler.Shutdown(SocketShutdown.Send);
_handler.Close();
_handler = null;
然后再
_handler =_socket.Accept();
等待其他B或者C的连接。B和C的连接程序如下:
IPEndPoint ipe = null;
Socket t_socket = null;
int _port =28001;
ipe = new IPEndPoint(IPAddress.Parse(_ip), _port);

t_socket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
t_socket.Connect(ipe);
t_socket.close();
t_socket = null;

现在的问题是,这2个客户连接程序,B在电脑A上(和server端同一个机器),一直运行没有问题,每次都可以正常连接到socket;
另一个程序C运行在另外一台机器上,大部分时间也没有问题,但是偶尔会socket连接不上(10次可能有一次吧),然后客户端和server端都堵塞在那个地方。

请问这是什么原因呢?
...全文
331 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hwyqy 2014-08-28
  • 打赏
  • 举报
回复
没分了,友情帮楼主顶,楼主给点分啊,不是没分估计也不会来顶贴
leskey 2014-08-28
  • 打赏
  • 举报
回复
再顶一下,大家看看
於黾 2014-08-28
  • 打赏
  • 举报
回复
你可以这样做: 服务端必须任何时候都能接受客户端的连接请求, 但是如果当前的逻辑没有执行完毕,不处理,给客户端回发一个信息,让它等待 而不是不再接受连接
leskey 2014-08-28
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
[quote=引用 楼主 leskey 的回复:] Program-A每隔一段时间需要接另外2个程序(B和C)发过来的信息(另外2个程序保证同时只有一个连接program-A) program -A收到B或者C的结束Message后,会执行 _handler.Shutdown(SocketShutdown.Send); _handler.Close(); _handler = null; 然后再 _handler =_socket.Accept(); 等待其他B或者C的连接。
这叫什么逻辑设计?看不懂。 你的服务器端应该测试可以同时接受100个客户端连接。而不是什么“一个发送结束Message,然后过一会儿另一个才能开始连接”。[/quote] ======================================== 这样,事实上这个系统是用在生产测试中的。每次解析客户的flow后然后不停的调用各种应用程序,同时只运行一个,按flow一步步跑下来,不确定用户会有多少个流程步骤,对某些产品定义100可能行,但某些不行。所以才用了这个每次运行一个连接,然后每次一个远程应用结束后,就reset一遍
leskey 2014-08-28
  • 打赏
  • 举报
回复
引用 16 楼 HtoFire 的回复:
没分了,友情帮楼主顶,楼主给点分啊,不是没分估计也不会来顶贴
============ 好吧,
  • 打赏
  • 举报
回复
引用 楼主 leskey 的回复:
Program-A每隔一段时间需要接另外2个程序(B和C)发过来的信息(另外2个程序保证同时只有一个连接program-A) program -A收到B或者C的结束Message后,会执行 _handler.Shutdown(SocketShutdown.Send); _handler.Close(); _handler = null; 然后再 _handler =_socket.Accept(); 等待其他B或者C的连接。
这叫什么逻辑设计?看不懂。 你的服务器端应该测试可以同时接受100个客户端连接。而不是什么“一个发送结束Message,然后过一会儿另一个才能开始连接”。
leskey 2014-08-27
  • 打赏
  • 举报
回复
顶一下,来人帮我看看,给点想法
leskey 2014-08-27
  • 打赏
  • 举报
回复
问题每次都是客户端B或者C连接的时候才会出错,如果连接正常了,发送接受数据一直很正常, 我在想是不是server端的_handler = _socket.Accept() 和客户端的t_socket.connect(ipe)之间有什么问题?? 这两个有严格的先后关系么?好像都可以。。。我在怀疑这个地方可能有问题!还是说每次都要吧socket关掉,重新初始化一遍,然后再accept?
於黾 2014-08-27
  • 打赏
  • 举报
回复
不好说. 尝试ping ip -t 看看丢包率
leskey 2014-08-27
  • 打赏
  • 举报
回复
难道这种不稳定是由于网络引起的?在局域网内怎么会有 这么高的failrate呢?我觉得应该是code或者逻辑哪里有问题。。。
於黾 2014-08-27
  • 打赏
  • 举报
回复
客户端连接不上,应该有超时啊,怎么会死住的 你用TCPClint来建立连接试试,不要直接socket.connect
leskey 2014-08-27
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
服务端Accept()就是等待连接了,不用处理 需要处理的是客户端 你应该客户端给服务端发送数据后,服务端回复一个消息,表示收到 如果客户端没有收到消息,必须重发 断开连接,应该是客户端负责重连,服务端只要保证处理完消息后能够继续ACCEPT,就可以了.
========================= 现在的问题是客户端在连接服务器端的时候,连接不上,一直hang在 t_socket.Connect(ipe); 也没有出错,出错会有try{}catch{}来重连的啊
於黾 2014-08-27
  • 打赏
  • 举报
回复
服务端Accept()就是等待连接了,不用处理 需要处理的是客户端 你应该客户端给服务端发送数据后,服务端回复一个消息,表示收到 如果客户端没有收到消息,必须重发 断开连接,应该是客户端负责重连,服务端只要保证处理完消息后能够继续ACCEPT,就可以了.
leskey 2014-08-27
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
同一台电脑,当然没问题,因为根本不走网卡,直接内存映射了 如果涉及网络,必然要考虑连不上的情况,做相应的超时处理,而不是一直阻塞等待
====================== 好像没有设置连接timeout的吧?貌似只有ReceiveTimeout和SendTimeOut 怎么做这个超时处理,我能想到的就是把这个线程kill掉,重新初始化一个
於黾 2014-08-27
  • 打赏
  • 举报
回复
同一台电脑,当然没问题,因为根本不走网卡,直接内存映射了 如果涉及网络,必然要考虑连不上的情况,做相应的超时处理,而不是一直阻塞等待
zdczdccccc 2014-08-27
  • 打赏
  • 举报
回复
把ProgramA的Accept lock试试
moonwrite 2014-08-27
  • 打赏
  • 举报
回复
不看代码的排除法 来多台D~ 如果D没有问题 那么就是C电脑有问题~

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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