110,549
社区成员
发帖
与我相关
我的任务
分享
public virtual void ReadCallback(IAsyncResult ar)
{
try
{
string _content = string.Empty;
SocketClientVO _state = (SocketClientVO)ar.AsyncState;
Socket _handler = _state.m_socket;
int _Available = _handler.Available;
byte[] RecievedData = new byte[_Available];
switch (_Available)
{
case 0:
Close(_state);
Logger.wirte("接收到0包" + _state.Code+"正常退出");
return;
default:
int curRcv = 0;
int hasRecv=0;
int left =_Available;
//_handler.EndReceive(
while (hasRecv < _Available)
{
curRcv = _handler.Receive(RecievedData, hasRecv, left, SocketFlags.None);
left -= curRcv;
hasRecv += curRcv;
}
break;
}
try
{
byte[] temp = new byte[0];
_handler.BeginReceive(temp, 0, 0, 0, new AsyncCallback(ReadCallback), _state);//继续读取下一个数据
}
catch
{
this.Close(_state);
}
}
catch (Exception ex)
{
Logger.wirte(ex);
}
}
备注
如果当前使用的是非阻止 Socket,一种较好的做法是在调用 Receive 之前使用 Available 来确定数据是否排队等待读取。可用的数据即网络缓冲区中排队等待读取的全部数据。如果在网络缓冲区中没有排队的数据,则 Available 返回 0。
如果远程主机处于关机状态或关闭了连接,则 Available 会引发 SocketException。如果收到 SocketException,请使用 SocketException.ErrorCode 属性获取特定的错误代码。获取此代码后,您可以参考 MSDN Library 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关该错误的详细说明。
int _Available;
try
{
_Available = _handler.Available;
}
catch
{
}