最近在看<<C#网络应用案例导航>>一书,它在处理TCP无消息边界问题上的做法我有一点不明白.
(略了非主要步骤的代码)
Socket.BeginReceive(......new AsyncCallBack(this.AcceptCallBack).....);
void AcceptCallBack(IAsyncResult ar)
{
//下边的socket是传过来的状态信息
int ReceivedLength=Socket.EndRecieve(ar);
if (ReceivedLength>0)
{
//我知道这是在读取信息收完的标志,Content是转换读到的数据后的字符串
if(Conent.IndexOf("EOF")>-1)
{
//读完了...显示读到的字符...........
}
else
{
//表示没有收完数据
Socket.BeginReceive(......new AsyncCallBack(this.AcceptCallBack).....); }
}
}
我的问题是:
异步的收与发送数据是不是:接收数据是等到有数据收到才回调?发数据是准备好发送的数据就回调?
主要是接收上的,1:如果是不等到有数据就回调,那么有可能是0,(远程机器还没发来数据)而这时数据还没有读完啊,它这里没有else了
2:如果是有数据发来才回调为什么要ReceivedLength>0才处理?这是肯定的啊
只用(Conent.IndexOf("EOF")>-1)不就好了?
还有个例子
if (ReceivedLength>0)
{
//我想它的意思是大于0就表示没有收完数据,这里又开始读
Socket.BeginReceive(......new AsyncCallBack(this.AcceptCallBack).....); }
else
{
//显示数据代码........
}
这个我也不明白,同样的如果远程主机还没有发来数据(TCP缓冲区的原因),就有可能是读到0那么怎么能说没读到数据就算是读完了??
朋友们帮我说明一下吧,谢了
(略了非主要步骤的代码)
Socket.BeginReceive(......new AsyncCallBack(this.AcceptCallBack).....);
void AcceptCallBack(IAsyncResult ar)
{
//下边的socket是传过来的状态信息
int ReceivedLength=Socket.EndRecieve(ar);
if (ReceivedLength>0)
{
//我知道这是在读取信息收完的标志,Content是转换读到的数据后的字符串
if(Conent.IndexOf("EOF")>-1)
{
//读完了...显示读到的字符...........
}
else
{
//表示没有收完数据
Socket.BeginReceive(......new AsyncCallBack(this.AcceptCallBack).....); }
}
}
我的问题是:
异步的收与发送数据是不是:接收数据是等到有数据收到才回调?发数据是准备好发送的数据就回调?
主要是接收上的,1:如果是不等到有数据就回调,那么有可能是0,(远程机器还没发来数据)而这时数据还没有读完啊,它这里没有else了
2:如果是有数据发来才回调为什么要ReceivedLength>0才处理?这是肯定的啊
只用(Conent.IndexOf("EOF")>-1)不就好了?
还有个例子
if (ReceivedLength>0)
{
//我想它的意思是大于0就表示没有收完数据,这里又开始读
Socket.BeginReceive(......new AsyncCallBack(this.AcceptCallBack).....); }
else
{
//显示数据代码........
}
这个我也不明白,同样的如果远程主机还没有发来数据(TCP缓冲区的原因),就有可能是读到0那么怎么能说没读到数据就算是读完了??
朋友们帮我说明一下吧,谢了
服务器端收到连接和接收数据都会回调. 而你的代码中把这两个回调使用了一个方法,当然这样也可以,但理解起来可能会很麻烦.如果你按MSDN中的写法,你就不会有太多的疑问了.
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconusingnon-blockingserversocket.htm