高分急求,c#下关闭socket,如何不产生TIME_WAIT呢??

CharmingAlgoMan 2011-11-11 11:15:54
c#下关闭socket,调用
ServerSocket.Shutdown(SocketShutdown.Both);
ServerSocket.Close();

此时,该socket进入TIME_WAIT长达2分钟

我该如何才能让socket不进入该状态呢?(这个对于我的应用来说是必须的)


c++的方法是设置SO_LINGER的状态
而.net里面没有这个参数

我查资料感觉应该是LingerOption与之对应
可无论我如何设置LingerOption,都无法让socket不进入TIME_WAIT

还看到有人发送空格产生错误来终止socket
可我发送空格产生不了错误,不知道为什么!!!



哪位神仙救命啊!~~~
...全文
694 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
风与彩虹 2013-12-05
  • 打赏
  • 举报
回复
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, new LingerOption(false, 0)); 更正
风与彩虹 2013-12-05
  • 打赏
  • 举报
回复
socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.Linger, new LingerOption(false, 0));
mrsupersky 2013-11-03
  • 打赏
  • 举报
回复
要不 自己实现 TCP,估计用RowSocket实现的话,性能比较低。 要不想办法绕过Windows的垃圾的TCPIP协议栈(之所以说是垃圾,实在是因为限制太多,定制性太差,Win TCP 协议栈 漏洞很容易被攻击) 安装一些开源的协议栈。。。。 针对性修改协议栈。。。
CharmingAlgoMan 2011-11-11
  • 打赏
  • 举报
回复
在注册表(regedit)的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters上添加一个DWORD类型的值TcpTimedWaitDelay,值就是秒数


这个经测试不好用
设置很小就没用了
似乎最短也要50秒左右
CharmingAlgoMan 2011-11-11
  • 打赏
  • 举报
回复
是啊,挺发愁的
lr5420511 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 charmingalgoman 的回复:]
感谢lr5420511如此热情

我的应用是我只能在一端编写程序,与另外一端长时间保持socket连接

但如果我这一端要断开连接,就会产生很多time_wait

另外一端他是从来都不会主动断开连接的,我没有办法控制他


应该怎么办呢?
[/Quote]
如果Server和Client不是同步开发的,这个问题用C#确实难搞
lr5420511 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 charmingalgoman 的回复:]
感谢lr5420511如此热情

我的应用是我只能在一端编写程序,与另外一端长时间保持socket连接

但如果我这一端要断开连接,就会产生很多time_wait

另外一端他是从来都不会主动断开连接的,我没有办法控制他


应该怎么办呢?
[/Quote]
喔,只能在一端编写程序呀,我还以为你又写Server又写Client呢!!!搞错了
CharmingAlgoMan 2011-11-11
  • 打赏
  • 举报
回复
感谢lr5420511如此热情

我的应用是我只能在一端编写程序,与另外一端长时间保持socket连接

但如果我这一端要断开连接,就会产生很多time_wait

另外一端他是从来都不会主动断开连接的,我没有办法控制他


应该怎么办呢?
lr5420511 2011-11-11
  • 打赏
  • 举报
回复
算了,给你个例子吧!!!
Server端Hello:
1.
private void ServerHelloClient()
{
ObjectFactory BllFactory = new BLLFactory();
IHY_BLL Ibll = BllFactory.GetSystemsocket();
Imodel.TCPServerSendHello = "hello!";
while (true)
{
if (TcpServerHelloThreadStop)
break;
else
{
Boolean i = Ibll.ServerSendData(Imodel);
if (!i)
{
Ibll.StopServerDataSocket(Imodel);
MessageBoxClass.ShowInfo(0, "(" + this.Text + ")已断开连接");
this.Close();
break;
}
Thread.Sleep(5000);
}
}
}
2.
/// <summary>
/// 服务器向客户端发送Hello包
/// </summary>
/// <param name="Imodel"></param>
/// <returns></returns>
public static bool ServerSendData(IHY_Model Imodel)
{
try
{
byte[] ServerData = new byte[ServerByteCoding(Imodel.TCPServerSendHello).LongLength];
ServerData = ServerByteCoding(Imodel.TCPServerSendHello);
Imodel.ServerDataSocket.Send(ServerData,SocketFlags.None);
return true;
}
catch
{
return false;
}
}
客户端Hello:
1.
private void ClientHelloServer()
{
ObjectFactory BllFactory = new BLLFactory();
IHY_BLL Ibll = BllFactory.GetSystemsocket();
Imodel.TCPClientSendHello = "hello!";
while (true)
{
if (TcpClientHelloThreadStop)
break;
else
{
Boolean i = Ibll.ClientSendData(Imodel);
if (!i)
{
Ibll.StopClientSocket(Imodel);
lock (groupBox1)
{
groupBox1.Enabled = true;
}
tabControl1.Enabled = false;
MessageBoxClass.ShowInfo(0,"("+ this.Text +")已断开连接");
break;
}
Thread.Sleep(5000);
}
}
}
2.
/// <summary>
/// 客户端向服务器发送Hello包
/// </summary>
/// <param name="Imodel"></param>
public static bool ClientSendData(IHY_Model Imodel)
{
try
{
byte[] ClientData = new byte[ClientByteCoding(Imodel.TCPClientSendHello).LongLength];
ClientData = ClientByteCoding(Imodel.TCPClientSendHello);
Imodel.ClientDataSocket.Send(ClientData, SocketFlags.None);
ClientData = null;
return true;
}
catch
{
return false;
}
}
CharmingAlgoMan 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lr5420511 的回复:]
引用 4 楼 charmingalgoman 的回复:
引用 1 楼 sandy945 的回复:
http://blog.csdn.net/wojiaosha123/article/details/5269996


这个方法是要在通信的双方都进行控制才可以

我的应用只能控制我自己的电脑,对方如何操作我无法控制。。。。。

楼主,你错了,对方如何你可以控制,比如每个一段时间向对……
[/Quote]


现在是我要主动断开连接

对方主动断开连接的话,我这边会产生错误,就不会有time_wait了

另外刚查询了windows修改的方法
在注册表(regedit)的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters上添加一个DWORD类型的值TcpTimedWaitDelay,值就是秒数

这个可以减少一部分time_wait,但不够灵活。
lr5420511 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 charmingalgoman 的回复:]
引用 1 楼 sandy945 的回复:
http://blog.csdn.net/wojiaosha123/article/details/5269996


这个方法是要在通信的双方都进行控制才可以

我的应用只能控制我自己的电脑,对方如何操作我无法控制。。。。。
[/Quote]
楼主,你错了,对方如何你可以控制,比如每个一段时间向对方发送一个Hello包,确认对方是否断开Tcp连接,行业里叫心跳包,有点像某个路由协议发送的Hello信息,如果检测到对方一段时间不回应你发送的信息或直接产生异常,就可判断他已经断开,你就可以主动ServerSocket.Shutdown(SocketShutdown.Both);
ServerSocket.Close();

CharmingAlgoMan 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sandy945 的回复:]
http://blog.csdn.net/wojiaosha123/article/details/5269996
[/Quote]

这个方法是要在通信的双方都进行控制才可以

我的应用只能控制我自己的电脑,对方如何操作我无法控制。。。。。
CharmingAlgoMan 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lr5420511 的回复:]
楼主,你对Tcp协议还不不了解啊!!!这个状态时无法避免的,参考资料
http://hi.baidu.com/tim_bi/blog/item/35b005d784ca91d5a044df1d.html
[/Quote]

这个是可以避免的
在c++可以设置SO_LINGER

用linux系统可以更改系统设置把time_wait时间变的很短

唯独我们用.net不知道该怎么办
lr5420511 2011-11-11
  • 打赏
  • 举报
回复
楼主,你对Tcp协议还不不了解啊!!!这个状态时无法避免的,参考资料
http://hi.baidu.com/tim_bi/blog/item/35b005d784ca91d5a044df1d.html
阿非 2011-11-11
  • 打赏
  • 举报
回复
TcpTimedWaitDelay 的取值应该可以设置到30

但是如果主动断开,那么肯定会有TIME_WAIT

111,098

社区成员

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

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

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