看过坛子里以前有兄弟提到过检查对端关闭连接用poll和available的组合,在异步socket下试了下,好像有点问题,以下是相关代码 public void OnAccept(IAsyncResult ar)
{
try
{
Socket cListener = (Socket)ar.AsyncState;
m_cSocket = cListener.EndAccept(ar);
m_cSocket.BeginReceive(m_BBuffer, 0, m_BBuffer.Length, SocketFlags.None, OnReceive, m_cSocket);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} public void OnReceive(IAsyncResult ar)
{
Socket sc = (Socket)ar.AsyncState;
try
{
if (sc.Poll(-1, SelectMode.SelectRead))
{
if (sc.Available > 0)
{
int nReceived = sc.EndReceive(ar);
if (nReceived > 0)
{
string sReceived = Encoding.ASCII.GetString(m_BBuffer, 0, nReceived);
m_cSocket.BeginReceive(m_BBuffer, 0, m_BBuffer.Length, SocketFlags.None, OnReceive, m_cSocket);
} }
else
{ m_cSocket.Shutdown(SocketShutdown.Both);
m_cSocket.Close();
m_cListener.Close();
m_cListener = null;
}
} }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}问题在sc.poll这里,每次当我的客户端发送第一个消息的时候比如一个字母"a",sc.Poll(-1, SelectMode.SelectRead)就block住了,没响应,客户端接着发送一个消息"b",这个时候sc.Poll(-1, SelectMode.SelectRead)才返回,我的服务端能接受到之前的那个消息"a",如此反复,客户端的最后一个消息收不到,不知道是什么原因,既然发第一个消息的时候beginreceive都能检测到有消息到来,而进入onReceive函数,为什么poll确检查不到可写呢?
{
try
{
Socket cListener = (Socket)ar.AsyncState;
m_cSocket = cListener.EndAccept(ar);
m_cSocket.BeginReceive(m_BBuffer, 0, m_BBuffer.Length, SocketFlags.None, OnReceive, m_cSocket);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} public void OnReceive(IAsyncResult ar)
{
Socket sc = (Socket)ar.AsyncState;
try
{
if (sc.Poll(-1, SelectMode.SelectRead))
{
if (sc.Available > 0)
{
int nReceived = sc.EndReceive(ar);
if (nReceived > 0)
{
string sReceived = Encoding.ASCII.GetString(m_BBuffer, 0, nReceived);
m_cSocket.BeginReceive(m_BBuffer, 0, m_BBuffer.Length, SocketFlags.None, OnReceive, m_cSocket);
} }
else
{ m_cSocket.Shutdown(SocketShutdown.Both);
m_cSocket.Close();
m_cListener.Close();
m_cListener = null;
}
} }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}问题在sc.poll这里,每次当我的客户端发送第一个消息的时候比如一个字母"a",sc.Poll(-1, SelectMode.SelectRead)就block住了,没响应,客户端接着发送一个消息"b",这个时候sc.Poll(-1, SelectMode.SelectRead)才返回,我的服务端能接受到之前的那个消息"a",如此反复,客户端的最后一个消息收不到,不知道是什么原因,既然发第一个消息的时候beginreceive都能检测到有消息到来,而进入onReceive函数,为什么poll确检查不到可写呢?
解决方案 »
- 问一个.net程序的奇怪问题
- C# 利用哈希表执行sql server事务
- c# 应用程序出错 大家帮忙看看问题出在哪呀 谢谢了 我急呀
- FROM 语法错误
- 关于实体类的几个疑问
- 清除事件代码后,编译时会出错?
- 高分求助 UP者有分 http://community.csdn.net/Expert/topic/3837/3837588.xml?temp=.653866
- 可以在winform上实现播放3D文件么?
- 我要将网页用抓图软件抓成图片,但是网页很长,超出了屏幕范围,怎么才能得到一张完整的图片呢?
- 委托函数
- 在C#中怎样实现像百度中的搜索框的下选效果!
- 请教关于System.Drawing.Point类型的坐标对该如何存储到一个集合中的问题
这个我试过了,把第一个参数改为3000,调试时跟踪进去,也是在客户端发送第一个消息的时候,这个函数返回false,为什么检测不到第一个消息呢?