社区
C#
帖子详情
C#中Socket没有OnReceive事件吗?
hillfree
2002-09-20 06:22:24
如果没有事件的话,岂不是要用死循环来做?
我做了一个:当客户端一旦shutdown并且close 套接字之后,服务器端就会将资源耗尽。
...全文
499
12
打赏
收藏
C#中Socket没有OnReceive事件吗?
如果没有事件的话,岂不是要用死循环来做? 我做了一个:当客户端一旦shutdown并且close 套接字之后,服务器端就会将资源耗尽。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 套接字之后,服务器端就会将资源耗尽
搞不懂你在做什么??
易语言-Hp-
Socket
For E 5.4.2 高性能TCP/UDP通信组件 源码+模块+例程
HP-
Socket
提供基于
事件
通知模型的 API 接口,能非常简单高效地整合到新旧应用程序
中
。 为了让使用者能方便快速地学习和使用 HP-
Socket
,迅速掌握框架的设计思想和使用方法,特此精心制作了大量 Demo 示例(如:...
HP-
Socket
通信框架-其他
HP-
Socket
是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含...5、处理通信
事件
(OnConnect/OnRe
ceive
/OnClose等) 6、停止通信组件(可选:在第7步销毁通信组件时会自动停止组件) 7、销毁通信组件 8、销毁监听器
C#
中
的
Socket
一:什么是
Socket
? 通过ip地址知道哪个计算机,通过端口号0-60000知道哪个计算机
中
的哪个软件
c#
socket
客户端异步实现
Socket
(AddressFamily.InterNetwork,
Socket
Type.Stream, ProtocolType.Tcp); _client
Socket
.BeginConnect(ip, new AsyncCallback(ConnectCallBack), _client
Socket
); } catch (Exception e) { throw e...
C#
,
Socket
网络连接
socket
通信测试
C#
110,538
社区成员
642,577
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章