Socket 出错提示(WSACancelBlockingCall 的调用中断)如何解决

lostowner 2008-05-19 08:26:40
原代码如下:


//开始监听
public bool Open()
{
string strTemp = "";
int length = 0;
byte[] tmpByte;
string strFrame = "";
string meterNo = "";

if (ListenerFlag)
{
MyServer = new IPEndPoint(this.IP, this.Port);
socketForClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketForClient.Bind(MyServer);
socketForClient.Listen(50); //50为可连接的链接数
((RichTextBox)m_richTextBox).AppendText("开始侦听:" + DateTime.Now.ToString() + "\r\n");
}
else
{
try
{
((RichTextBox)m_richTextBox).Text += "停止侦听" + "\r\n";
if (newSocket != null)
{
if (newSocket.Connected)
{
newSocket.Shutdown(SocketShutdown.Both);
}
newSocket.Close();
}
if (socketForClient != null)
{
socketForClient.Close();
}
GC.Collect();

}
catch (Exception ex)
{
MessageBox.Show("停止侦听---" + ex.ToString());
}
return false;
}

while (ListenerFlag)
{
//返回可以用以处理连接的Socket实例

if (socketForClient!=null)
newSocket = socketForClient.Accept(); //停止监听时此处会出错

remoEP = (IPEndPoint)newSocket.RemoteEndPoint;

newSocket.Blocking = true; //阻塞方式

if (newSocket.Connected)
{
////newSocket.ReceiveTimeout = 10000;

((RichTextBox)m_richTextBox).Text += DateTime.Now.ToString() + ":" + "与客户端 " + remoEP.Address.ToString() + " 建立了连接" + "\r\n";
//接受数据
while (true)
{
tmpByte = new byte[DEALLEN];
//temp = AcceptBytes();
strTemp = "";
length = newSocket.Receive(tmpByte, tmpByte.Length, 0);
for (int i = 0; i < length; i++)
{
strTemp += tmpByte[i].ToString("X2") + " ";
}
////strTemp = Encoding.BigEndianUnicode.GetString(tmpByte);
strTemp += " " + DateTime.Now.ToString();
//length = AcceptBytes();
//接收心跳帧
if (length == 18)
{
meterNo = "";
((RichTextBox)m_richTextBox).Text += "心跳数据:" + strTemp + "\r\n";
//SendBytes("680C0C6841160000350608000E411000F916");
strFrame = "680C0C6841160000350608000E411000F916";
((RichTextBox)m_richTextBox).Text += "心跳应答:" + strFrame + " " + DateTime.Now.ToString() + "\r\n";
if (!loginFlag)
{
((RichTextBox)m_richTextBox).Text += "终端:" + meterNo + "---上线" + "\r\n";
loginFlag = true;
}
SendBytes(strFrame);
////tmpByte = Algol.GetHexBytes(strFrame);
////socketForClient.Send(tmpByte, tmpByte.Length, 0);
}
else if (length > 0)
{
((RichTextBox)m_richTextBox).Text += strTemp + "\r\n";
}
//客户端断开时,length为0

if (length == 0)
{
((RichTextBox)m_richTextBox).Text += "客户端已断开连接,重新开始侦听" + "\r\n";
if (newSocket != null)
{
newSocket.Shutdown(SocketShutdown.Both);
newSocket.Close();
}
break;
}

}
}
}
return true;
}

执行停止监听时

if (socketForClient!=null)
newSocket = socketForClient.Accept(); //停止监听时此处会出错

此处会出错,请问如何解决
...全文
489 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
huing 2008-05-26
  • 打赏
  • 举报
回复

....
while(true)
{
try
{
tcpClient = server.AcceptTcpClient();

NetworkStream ns = tcpClient.GetStream();
.....
接收信息
做自己需要做的事
ns.Close();
tcpClient.Close();
}
catch(Exception ex)
{
if (null != ns)
{
ns.Close();
}
if (null != tcpClient)
{
tcpClient.Close();
}
Console.WriteLine(ex.Message + " AcceptTcpClient error \r\n" + ex.StackTrace);
}
lostowner 2008-05-26
  • 打赏
  • 举报
回复
zzultc 你好!谢谢你的分析 能否可以跟你QQ聊一下,我的QQ是253878078
zzultc 2008-05-24
  • 打赏
  • 举报
回复
仔细想了一下,发现有以下可能:
1、你使用的是2.0以下的.net,所以在工作线程中操作UI线程的(RichTextBox)m_richTextBox编译没有报错。
2、你在UI线程里通过一个button控制ListenerFlag变量,然后再运行open方法进行开始停止。
呵呵,以上是推测,我估计的问题出在:
if (newSocket != null)
{
if (newSocket.Connected) //.Connected反映最近操作时的连接状态
{
newSocket.Shutdown(SocketShutdown.Both);
}
newSocket.Close();
}
在SDK里,这样说明:
Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。
所以,估计你的代码返回的是false,所以没有Shutdown直接Close了,引发了下边while里边的异常。
推测而已,你可以看看是不是if里边的语句没有执行!
zzultc 2008-05-24
  • 打赏
  • 举报
回复
你这个是不是就是在UI线程里运行的啊?应该是!
运行时界面应该是死机状态,你怎么停止监听的?
zzultc 2008-05-24
  • 打赏
  • 举报
回复
你的这个程序貌似只能一次服务一个客户啊!
lostowner 2008-05-20
  • 打赏
  • 举报
回复
快来了 加50分
lostowner 2008-05-20
  • 打赏
  • 举报
回复
我顶
lostowner 2008-05-19
  • 打赏
  • 举报
回复
我顶 解决了可以加分

110,539

社区成员

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

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

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