c# 如何关闭异步socket 释放端口

XO120 2010-04-05 10:51:40
利用updclient异步传输数据

目前是在数据传送完后就想关闭该端口(因为端口是大量随机获取,故需要关闭以给后面的连接使用),

但是在数据传输完后就关闭端口的话,此时还在调用的结束接收或发送的异步代理函数,那么系统就会报错

1.在异步代理函数完全完成后再结束,但是我不知道该怎么做
2.不知道有没有别的方法
...全文
4717 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pkugnss 2011-11-30
  • 打赏
  • 举报
回复
楼上的讨论的好激烈。。
mark/
xingyuebuyu 2010-04-06
  • 打赏
  • 举报
回复
异步处理时有个回调函数,你在回调函数中关闭端口就可以了
XO120 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sp1234 的回复:]
引用 12 楼 xo120 的回复:
呵呵,我的服务器段的端口是随机获取的,没有固定哪一个,文件传输完成就释放掉


什么叫做服务器端呢?客户端难道不需要知道服务器端使用哪一个remote地址和端口,不需要先搞明白先后次序?即使你的所谓“服务器端口随机获取”背后预先设计的什么协议来让客户端无需访问服务器端就掐算出服务器的端口来,那么你说的“关闭那个端口”的描述也是及其缺乏从设计角度的东西的……
[/Quote]

呵呵,我通过客户端发送请求信息,包含客户端的线程数,此时服务端收到信息,开启对应条数的线程和端口,并且启动服务端socket;之后客户端利用返回的端口分配到其各个线程,这样的才进行发送的
  • 打赏
  • 举报
回复
恩,发送的demo我少了几个单词
using (var x = new UdpClient())
{
x.Connect(host, port);
x.Send(buffer, buffer.Length);
}
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xo120 的回复:]
呵呵,我的服务器段的端口是随机获取的,没有固定哪一个,文件传输完成就释放掉
[/Quote]

什么叫做服务器端呢?客户端难道不需要知道服务器端使用哪一个remote地址和端口,不需要先搞明白先后次序?即使你的所谓“服务器端口随机获取”背后预先设计的什么协议来让客户端无需访问服务器端就掐算出服务器的端口来,那么你说的“关闭那个端口”的描述也是及其缺乏从设计角度的东西的。如果你抄别人的代码,也要搞懂其设计,而不要仅仅因为一两条语句。
  • 打赏
  • 举报
回复
看来没有代码很难说清楚了。不过如果你贴出来,可能我也没有耐心看完你的代码。我给你写几行简单的demo:假设要发送一条udp消息大致是这样
using (var x = Connect(host, port))
{
x.Send(buffer, buffer.Length);
}
而一个服务在启动时大致是这样
    var th= new UdpClient(new IPEndPoint(IPAddress.Any, port));
th.BeginReceive(handler =>
{
IPEndPoint endpoint = null;
var data = this.EndReceive(handler, ref endpoint);
try
{
处理收到的数据(data,endpoint);
}
catch (Exception ex)
{
.......通常是记录Log
}
}, null);
}
XO120 2010-04-06
  • 打赏
  • 举报
回复
呵呵,我的服务器段的端口是随机获取的,没有固定哪一个,文件传输完成就释放掉
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xo120 的回复:]
服务端,关闭的socket连接,释放服务端的端口,因为服务端的端口是随机获取的,如果那个端口没有用,我就占用,如果不释放的话,导致服务器连接过多,当然不是个好事
[/Quote]

你的服务监听端口还必须随时“释放”?什么是服务端呢?

还服务器连接过多。给你个概念,如果服务器被1000个客户端连,需要监听几个端口?1个!
XO120 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xingyuebuyu 的回复:]
EndReceive的返回值为0就表示接受完成了
EndSend的返回值为0就表示发送完成了,这个时候就可以去关闭端口
[/Quote]

呵呵,udp 的EndReceive返回的是byte[],不会当他为null的时候去关闭吧
  • 打赏
  • 举报
回复
哦,更确切地说,使用udp完成高级一点的通信程序,就谈不上c/s了,每一方都是既是一个Server也是一个Client。
  • 打赏
  • 举报
回复
我仍然还是无法理解楼主所说的“关闭端口”的概念。例如说“但是在数据传输完后就关闭端口的话,此时还在调用的结束接收或发送......”,这明显不符合udp的概念,因为udp根本不知道什么时候是传输完,它只是把数据扔到本地的缓冲区去就完了,并且也可以立刻将udpclient(当然也就包括其中的Socket)进行Close,没有任何问题。udp是完全不可靠的连接,并且是单向的,因此c/s双方必须制定更加完备的应用层通信协议,对数据进行抽象(至少要有唯一的编号),要负责校验、重发等等。长连接过程是复杂的。而楼主所说的似乎很少有设计成分,似乎就是个别一两个语句想让别人给写出来,而我也看不出到底是什么语句有问题。
XO120 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sp1234 的回复:]
不懂你说的“该端口”是什么。端口至少有两种,Remote以及Local的,你连这个都没有分清,无法理解你的问题。
[/Quote]

服务端,关闭的socket连接,释放服务端的端口,因为服务端的端口是随机获取的,如果那个端口没有用,我就占用,如果不释放的话,导致服务器连接过多,当然不是个好事
  • 打赏
  • 举报
回复
udp消息你基本上可以认为有50%的机会会丢失,这怎么来确定什么时候结束?
xingyuebuyu 2010-04-06
  • 打赏
  • 举报
回复
EndReceive的返回值为0就表示接受完成了
EndSend的返回值为0就表示发送完成了,这个时候就可以去关闭端口
  • 打赏
  • 举报
回复
不懂你说的“该端口”是什么。端口至少有两种,Remote以及Local的,你连这个都没有分清,无法理解你的问题。
XO120 2010-04-06
  • 打赏
  • 举报
回复
但是,在传文件完成时,客户端发送传文件完成信号,此时服务端既关闭该端口,服务端当收到客户端传过来的信号时,我关闭了该端口,可是异步回调函数被多次循环调用,有的数据还没有接受完,此时没有了端口就出现异常


如果不关闭的话那么客户端连接多了会导致服务器慢,端口全被占满,没法使用等等

异步处理函数有2个,一个是处理接收的,一个是处理发送的,无论在哪一个里面关闭,都有可能出现数据没有处理完导致异常

足球中国 2010-04-05
  • 打赏
  • 举报
回复
udp 不用关闭吧。
个人感觉。
udp是无连接的。

110,534

社区成员

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

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

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