高分急问关于Socket TCP方式重新连接服务器为何就连不上了呢?

cchinasp 2004-04-30 09:18:09
我做TCP客户端,服务器端是别的公司的端口。
每分钟互相通讯一次,保持长连接,但还是每隔几天服务器可能因为各种原因,断开连接。

本来我以为重新连接好简单。我用了两种方式:

1。 我做了个Timer计时,计算超过2分钟没有收到过数据,就重新连接。

2。beginsend或beginreceive发生错误就重新连接。

但以上两种方式不能正常重新连上服务器,可能是我重连的代码写错了,请大家帮忙看看。

private static void IniSocket(){
string hostName="100.100.100.100";
//端口
int port=Int32.Parse("8090");
//得到主机信息
IPHostEntry ipInfo=Dns.GetHostByName(hostName);
//取得IPAddress[]
IPAddress[] ipAddr=ipInfo.AddressList;
//得到ip
IPAddress ip=ipAddr[0];
//组合出远程终结点
IPEndPoint hostEP=new IPEndPoint(ip,port);
//socket是form全局对象,现在创建Socket 实例
socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
Connect(hostEP,socket);
Receive(socket);

}

这样,第一次连接就调用这段代码,没问题。
重连时,就是连不上,对方无反映。可排除服务器故障。




...全文
776 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
magicworld 2004-05-05
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/3033/3033736.xml?temp=.3871118


此贴有分相送

c#+sql的项目

作个资产管理系统的web输入部分, 

基本目标,

从web页面取得数据,然后保存到sql数据库里面

现在基本做好框架了, 

但是还有几个问题很难解决,希望找个高手

来指导一下

本人,一个月前才开始c# 学习

比较笨,希望高手不吝赐教,做好以后高分相送(准备送个几百分吧,呵呵)

qq34214135

基本全天都在,

验证csdn
cchinasp 2004-05-05
  • 打赏
  • 举报
回复
有启发,再试试。
cqing 2004-05-01
  • 打赏
  • 举报
回复
socket.Close() is not enough,the correct way to close a socket shoud be like this:

socket.Shutdown(SocketShutdown.Both);
socket.Close();

also, when you create a new socket, it is better to add these statements:

LingerOption _lingerOption = new LingerOption(false,10);
socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Linger,_lingerOption);

sorry I cannot type Chinese now
gogogo 2004-04-30
  • 打赏
  • 举报
回复
你用了try,就不会他弹出异常错误了,还弹出说明异常发生的位置不在你的try里
cchinasp 2004-04-30
  • 打赏
  • 举报
回复

我这样试了一下,报上面的错,是什么意思:

错误内容:System.ObjectDisposedException: 无法访问名为“System.Net.Sockets.Socket”的已处置对象。
对象名: “System.Net.Sockets.Socket”。
at System.Net.Sockets.Socket.BeginReceive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state)
at SMS_Listener.Form1.Receive(Socket client) in e:\works\防伪\sms_listener\form1.cs:line 352
gogogo 2004-04-30
  • 打赏
  • 举报
回复
应该使用greatsft(C的使者) 的方式,即使是长连接,必须有try,在出现异常的时候使用close,这样的好处除了清理你本地的连接和socket以外,对服务器端也有好处。而且你还可以根据异常catch(Excetpion ee)中的ee类型决定不同处理方式,这些结束了在重新建立连接。
cchinasp 2004-04-30
  • 打赏
  • 举报
回复
可以支持多个客户端。
我是TCP客户端啊,不用侦听啊。采用异步接收、发送。
gogogo 2004-04-30
  • 打赏
  • 举报
回复
你的服务器可以由多个客户端同时连接吗?我的意思是你的服务器侦听端口是8090,客户端建立连接后使用新的套接字socket,用新的端口还是继续使用8090和客户通信,这时8090就不用于侦听了?
cchinasp 2004-04-30
  • 打赏
  • 举报
回复
很头疼啊,还是不行啊。

错误内容:System.ObjectDisposedException: 无法访问名为“System.Net.Sockets.Socket”的已处置对象。
对象名: “System.Net.Sockets.Socket”。
at System.Net.Sockets.Socket.BeginReceive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state)
at SMS_Listener.Form1.Receive(Socket client) in e:\works\防伪\sms_listener\form1.cs:line 352
gogogo 2004-04-30
  • 打赏
  • 举报
回复
把你的connect和receive方法贴出来
cchinasp 2004-04-30
  • 打赏
  • 举报
回复
to gogogo(嘿嘿) :

==============================

因为我要实时取得服务器端不定时发送的信息,一定要长连接。
每分钟通讯一次是为了让服务器了解我是否正常连接的。

我这边根据他是否每分钟发过来数据判断是否连接。
所有我用两分钟。服务器端程序应该是没什么问题的,已经正常运行好几年了。



cchinasp 2004-04-30
  • 打赏
  • 举报
回复
我开始想可能是不是每次重连就重新实例化的问题,不过你们这个思路好象也很有道理,我再试试。
greatsft 2004-04-30
  • 打赏
  • 举报
回复
同意 gogogo(嘿嘿)的说法,你每建立一次连接,如果出现异常一定要关闭这个连接,
否则下次重连的话,还是会用这个连接,这样一旦这个连接出现异常固障的话,你以后每次重新的连接都是错误的,我想这就是出现你现在这个问题的原因
你可以这样写:
try{
string hostName="100.100.100.100";
//端口
int port=Int32.Parse("8090");
//得到主机信息
IPHostEntry ipInfo=Dns.GetHostByName(hostName);
//取得IPAddress[]
IPAddress[] ipAddr=ipInfo.AddressList;
//得到ip
IPAddress ip=ipAddr[0];
//组合出远程终结点
IPEndPoint hostEP=new IPEndPoint(ip,port);
//socket是form全局对象,现在创建Socket 实例
socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
Connect(hostEP,socket);
Receive(socket);

}
}
catch(Excetpion ee){
socket.Close();
}
finally{
socket.Close();
}


wish u good luck
Greatsft
ejiue 2004-04-30
  • 打赏
  • 举报
回复
gz
gogogo 2004-04-30
  • 打赏
  • 举报
回复
我认为你的设计有问题,既然每分钟通信一次,你就不要长连接,应该每分钟建一次连接,通信完一定要关闭,这样就没问题了。至于你目前的症状估计是服务器端设计也有问题,可能是侦听和通信端口都是8090,造成短线后,不能短时间内连接,因为8090端口仍然被占用,在tcp/ip理论中称为2MSL事件,至少要2分钟以上,你的2分钟太短了。
lvenlee 2004-04-30
  • 打赏
  • 举报
回复
你可以试着用一个进程的不断循环来监控连接的状态,如果连接断开则重新尝试连接!!

你的连接方式我更喜欢用TCPClient来监听!!
真相重于对错 2004-04-30
  • 打赏
  • 举报
回复
close
cchinasp 2004-04-30
  • 打赏
  • 举报
回复
再次up
zjm107 2004-04-30
  • 打赏
  • 举报
回复
我也想知道答案,up
cchinasp 2004-04-30
  • 打赏
  • 举报
回复
报错信息:

发生错误时间:2004-4-30 9:12:30
错误内容:System.Net.Sockets.SocketException: 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
at System.Net.Sockets.Socket.BeginReceive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state)
at SMS_Listener.Form1.Receive(Socket client) in e:\works\防伪\sms_listener\form1.cs:line 348
加载更多回复(8)

110,555

社区成员

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

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

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