请教Socket通讯的问题

llsus 2010-01-11 02:26:06
这是Socket的服务端,请看代码中的注释部分

s.Listen(100);
while (true)
{
byte[] bytes = new byte[1025];
Socket ss = s.Accept();
try
{
ss.ReceiveTimeout = 0;
while (true)
{
ss.Receive(bytes);
//这里我如何检测对方的连接已经断开?本来指望对方断开后这里会出现异常自动退出循环的,问题是对方断开后,依然可以接收到数据,并不发生异常
string rmsg = Encoding.Default.GetString(bytes);
rmsg = rmsg.Substring(0, rmsg.IndexOf('\0'));
textBox1.Text = textBox1.Text + rmsg;
if (rmsg == "close") break;
//当连接方没有发送close直接断开后,这里会进入死循环,并且持续得到连接方最后发来的一笔数据
}
ss = null;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
ss.Close();
}
}


请问如上注释部门的问题怎么解决?
...全文
120 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
llsus 2010-01-12
  • 打赏
  • 举报
回复
谢谢楼上的朋友,我这个是简单的1对1的通讯,比较简单,所以我就写在一起了.
liushengmz 2010-01-11
  • 打赏
  • 举报
回复
已经给了分的了啊?唉。。。。搞得我还这边一个人自言自语呢!
liushengmz 2010-01-11
  • 打赏
  • 举报
回复
楼主的代码处理得不够好,应该分两个线程来处理。

一条线程应该用来读取客户端连接(Socket ss = s.Accept();)

一条线程应该用来处理业务(ss.Receive(bytes);)

第二条线程可以通过数据来判断是否要退出,也就是可以正常退出。

但第一条线程就不一定了,因为它是阻塞式的通信,就算是加个变量

来判断是否可以退出也无效,因为它阻塞,根本没机会读到变量是否改变。

只能通过主线程来强行打断。

说得有点过头了,不知楼主能否理解。
llsus 2010-01-11
  • 打赏
  • 举报
回复
谢谢8楼和5楼的朋友。
满衣兄 2010-01-11
  • 打赏
  • 举报
回复
加定时器
wenbin 2010-01-11
  • 打赏
  • 举报
回复
int rec = ss.Receive(bytes);

//连接断开
if(rec == 0){
break;
}
llsus 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 starfd 的回复:]
mark一下

socket.Blocking = false;
if (socket.Poll(50, SelectMode.SelectRead))
{
  socket.Disconnect(true);
  socket.Close();
  break;
}

socket.Blocking = true;

不知道有用没用额~~~~


[/Quote]


没用啊
ztenv 2010-01-11
  • 打赏
  • 举报
回复
if (rmsg == "close") break;
//当连接方没有发送close直接断开后,这里会进入死循环,并且持续得到连接方最后发来的一笔数据

你这是业务的东西,不应该放到这里处理,
ztenv 2010-01-11
  • 打赏
  • 举报
回复
ss.Receive(bytes);
//这里我如何检测对方的连接已经断开?本来指望对方断开后这里会出现异常自动退出循环的,问题是对方断开后,依然可以接收到数据,并不发生异常
看看收到的字节的长度,如果是-1,说明已经断开了。。。。C#中的socket都是封装了事件了。。。。。。你不可以通过事件判断吗?
C++中才需要判断收到的字节长度。。。。。。

你想回归原始?
  • 打赏
  • 举报
回复
mark一下

socket.Blocking = false;
if (socket.Poll(50, SelectMode.SelectRead))
{
socket.Disconnect(true);
socket.Close();
break;
}

socket.Blocking = true;

不知道有用没用额~~~~

ysz89757 2010-01-11
  • 打赏
  • 举报
回复
不会,顶一下
llsus 2010-01-11
  • 打赏
  • 举报
回复
你说的是连接方,不是服务方啊,连接方不存在我说的那个问题。
pandorla2008 2010-01-11
  • 打赏
  • 举报
回复
检测对方断开:

检查tcpclient的active属性
举例说明
[C#]
// This derived class demonstrates the use of three protected methods belonging to the TcpClient class
public class MyTcpClientDerivedClass : TcpClient
{

// Constructor for the derived class.
public MyTcpClientDerivedClass() : base()
{
}
public void UsingProtectedMethods()
{

// Uses the protected 'Active' property belonging to the TcpClient base class
// to determine if a connection is established.
if (this.Active){
// Calls the protected 'Client' property belonging to the TcpClient base class.
Socket s = this.Client;
// Uses the Socket returned by Client to set an option that is not available using TcpClient.
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
}
// To free all resources, calls the protected virtual method Dispose belonging to the TcpClient base class.
this.Dispose(true);
GC.SuppressFinalize(this);

}

}


循环的话。。用个 while(boolVar)之类的就行了吧。

111,093

社区成员

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

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

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