做了一个多线程文件发送和接收的小程序。socket采用异步的方式发送和接收。代码如下: private void OnEndReceiveData(IAsyncResult ar2)
{
int receiveLength = 0;
SocketStateObject so = null;
so = (SocketStateObject)ar2.AsyncState;
if ( so.WorkSocket != null && so.WorkSocket.Connected )
{
try
{
receiveLength = so.WorkSocket.EndReceive( ar2 );
}
catch
{
//socket已经断开
TSession.SetSessionStatus( so.IPPortValue , EnumSessionState.Closed );
}
if ( receiveLength > 0 )
{
try
{ TDatagram.ResolveBuffer( TSession.GetSessionFromIPPort( so.IPPortValue ) , so.buffer , receiveLength );
ReceiveDone.Set( ); //继续取数据
if ( so.WorkSocket != null && so.WorkSocket.Connected )
{
so.WorkSocket.BeginReceive( so.buffer , 0 ,
so.BUFFER_SIZE , SocketFlags.None , EndReceiveData , so ); ReceiveDone.WaitOne( );
}
}
catch
{
ReceiveDone.Set( );
}
}
else
{
ReceiveDone.Set( );
//socket已经断开
TSession.SetSessionStatus( so.IPPortValue , EnumSessionState.Closed );
}
}
else
{
ReceiveDone.Set( );
TSession.SetSessionStatus( so.IPPortValue , EnumSessionState.Closed ); } }在每一个包的头和尾都加了标志,用于区分一个完整包。但发现在分析包数据时会出现receiveLength的长度,和接收到的so.buffer中的数据不一致。receiveLength的长度会小于so.buffer中实际接收到的数据长度。so.buffer中不为空的有效数据的长度大于receiveLength的长度。难道是缓冲区溢出?
请高手帮忙分析一下,感激不尽!!!
{
int receiveLength = 0;
SocketStateObject so = null;
so = (SocketStateObject)ar2.AsyncState;
if ( so.WorkSocket != null && so.WorkSocket.Connected )
{
try
{
receiveLength = so.WorkSocket.EndReceive( ar2 );
}
catch
{
//socket已经断开
TSession.SetSessionStatus( so.IPPortValue , EnumSessionState.Closed );
}
if ( receiveLength > 0 )
{
try
{ TDatagram.ResolveBuffer( TSession.GetSessionFromIPPort( so.IPPortValue ) , so.buffer , receiveLength );
ReceiveDone.Set( ); //继续取数据
if ( so.WorkSocket != null && so.WorkSocket.Connected )
{
so.WorkSocket.BeginReceive( so.buffer , 0 ,
so.BUFFER_SIZE , SocketFlags.None , EndReceiveData , so ); ReceiveDone.WaitOne( );
}
}
catch
{
ReceiveDone.Set( );
}
}
else
{
ReceiveDone.Set( );
//socket已经断开
TSession.SetSessionStatus( so.IPPortValue , EnumSessionState.Closed );
}
}
else
{
ReceiveDone.Set( );
TSession.SetSessionStatus( so.IPPortValue , EnumSessionState.Closed ); } }在每一个包的头和尾都加了标志,用于区分一个完整包。但发现在分析包数据时会出现receiveLength的长度,和接收到的so.buffer中的数据不一致。receiveLength的长度会小于so.buffer中实际接收到的数据长度。so.buffer中不为空的有效数据的长度大于receiveLength的长度。难道是缓冲区溢出?
请高手帮忙分析一下,感激不尽!!!
要注意TCP是流传输,每次接收的数据量是不定的,不会正好是一个包,可能是小半个,
也可能是一个多。
另外你的so.buffer在每次接收中是重用的,也就是说上次接收的数据若比这次长,
那么你在so.buffer中的后边实际上可以看到上次的部分数据。
当第一次读包不是一个完整的包时,
要继续读,直到把这个包读对才行
不要担心会丢数据,TCP是不会的。要做的就是等下个包的到来