C#中Socket没有OnReceive事件吗?

hillfree 2002-09-20 06:22:24
如果没有事件的话,岂不是要用死循环来做?

我做了一个:当客户端一旦shutdown并且close 套接字之后,服务器端就会将资源耗尽。
...全文
499 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
henryfan1 2002-09-23
  • 打赏
  • 举报
回复
if(length = 0)
break;
当然收到0字节时就退出。
或协定一个字符来标释要退出。
henryfan1 2002-09-23
  • 打赏
  • 举报
回复
若要结束关闭 Socket,则必须在调用 Shutdown 之后对 Close 进行调用。
那个方法只是禁用,并没有关闭!
nerk 2002-09-23
  • 打赏
  • 举报
回复
关于一方断掉另一方不知道,这叫做“半连接”

请参见<TCP/IP详解 卷一:协议> 第18章
nerk 2002-09-23
  • 打赏
  • 举报
回复
做这种操作不能用while循环的。

要用异步调用。(见MSDN:ASyncCallback ,ASyncResult)

建议你自己写一个组件,提供onReceive事件。
hillfree 2002-09-23
  • 打赏
  • 举报
回复
我的调用的确是:
mySocket.Shutdown(..);
mySocket.Close();


此外,使用while(true)死循环的话,需要强行abort线程,这样会throw异常,难道就没有好办法了。
hillfree 2002-09-22
  • 打赏
  • 举报
回复
我想我可能没有说清楚。

在.net中对于套接字编程,分别由Socket, TcpListener, TcpClient, UdpClient,几个类完成。

其中封装层次最低的是Socket.固然可以通过NetworkStream来处理。但是这种方式在某些场合下并不合适,比如跨语言的比较底层的应用中,需要很具体细致的规定报文中每个字节的编排编码格式。

所以,我在程序中使用byte[]。当然在很多其他应用使用stream也是很方便的。

此外,服务器端当然要起线程来做事情了。区区也是这么做的。线程中系统会在诸如AcceptSocket,或者Receive等方法的地方自动block。这很好。也没有问题。只是在线程处理中有一个疑问:我是通过如下一段程序的:

clientSocket = covaTcpListener.AcceptSocket();
try
{
while(clientSocket.Connected == true)
{
byte[] data;
int length = clientSocket.Receive(data);
if(length != 0)
...}
}

而且发送消息,处理都正常。只是当客户端的socket一旦断掉,调用Shutdown之类,服务器端的clientSocket.Connected仍然等于true.而且clientSocket.Receive(data)的地方也不再阻塞。而是疯狂的循环起来,如果不在后面的循环代码里加入:Thread.Sleep(xx);之类的语句,机器的CPU占用率会一直呆在100%。

所以,我就是在问:为什么是这样?这种情况下比较地道的处理方式是什么?

此外,虽然我也用VB,Delphi之类的东西编过一些小项目,不过在接触C#之前,使用最多的是VC,所以我会有此一问。见笑了。

还望大家不吝赐教。
paulluo0739 2002-09-22
  • 打赏
  • 举报
回复
不是死循环,你单独建立一个线程来专门接受客户端的消息,相当于自己写了一个OnReceive,如果客户端断开你就关掉这个线程,就OK了。
zero8223 2002-09-22
  • 打赏
  • 举报
回复
呵呵
hillfree 2002-09-22
  • 打赏
  • 举报
回复
那些内容当然是在一个线程中,有一个连接就有一个线程来处理。

问题是:为什么客户端socket.shutdown了。服务器端相应线程中,clientsocket.connected还是true?
henryfan1 2002-09-22
  • 打赏
  • 举报
回复
while(true)
{
byte[] data;
int length = clientSocket.Receive(data);
if(length = 0)
break;
.............
.............

}
应该封装在一个类中,当然有客户连接时就产生一个独立的类来处理。
henryfan1 2002-09-22
  • 打赏
  • 举报
回复
这一段分离到另一个线程不知道是否可行
if(clientSocket.Connected)
{
产生以下线程
while(true)
{
byte[] data;
int length = clientSocket.Receive(data);
if(length = 0)
break;
.............
.............

}

}
acsharplover 2002-09-21
  • 打赏
  • 举报
回复
是不是VB用多了,C#中是通过StreamRead和StreamWrite类读写用NetworkStream
从Socket中接受的数据。

至于什么时候结束,可以用循环判断读取的数据是否为NULL。

当客户端一旦shutdown并且close 套接字之后,服务器端就会将资源耗尽
搞不懂你在做什么??

110,538

社区成员

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

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

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