int Sockethelper::getavailbytes() const
{
	if (m_sock_flags.tcpserver)
		return -1; // is tcp-server

	u_long ret;
	if (!IOCtl(FIONREAD, &ret))
		throw socket_error("getavailbytes");
	return ret;
}
/**
* 得到网络接收缓冲区收到的帧数量
* @param void
* @return DWORD 帧数量
*/
DWORD CSocketTailTimeFrame::GetFrameCount()
{
	DWORD dwFrameCount = 0;

	// 得到网络接收缓冲区数据字节数
	IOCtl(FIONREAD, &dwFrameCount);
	// 得到帧数量
	dwFrameCount = dwFrameCount / m_iFrameSize;

	return dwFrameCount;
}
Example #3
0
void cDataSocket::OnReceive(int nErrorCode) 
{
   DWORD DataLen = 0;
   
   // see how many bytes are available to receive
   IOCtl(FIONREAD,&DataLen);

   // if no data we are done
   if ( DataLen <= 0 )
      return;

   // allocate data buffer to receive data
   char *pBuffer = (char *) calloc( DataLen + 1, sizeof(char) );

   // check for allocation error
   if ( !pBuffer )
   {
      AfxMessageBox( _T("Out of memory!!!") );
      return;
   }
   
   if ( Receive( pBuffer, DataLen ) == SOCKET_ERROR )
   {
      free( pBuffer );
      return;
   }

   // null terminate the data just in case
   // the owner forgets to check and does
   // some string manipulation
   pBuffer[DataLen + 1] = '\0';

   // check for a valid data handling window
   if ( !AfxIsValidAddress( m_pDataHandlerWnd, 1, FALSE ) )
   {
      free( pBuffer );
      return;
   }

   if ( m_pDataHandlerWnd > 0 && AfxIsValidAddress( m_pDataHandlerWnd, 1, FALSE ) )
   {
      // post pointer to the data
      // NOTE:  the memory allocated here will be freed in the data handler
      m_pDataHandlerWnd->PostMessage( WM_USER + 1,
                                      (WPARAM) pBuffer,
                                      (LPARAM) DataLen );
   }
		
	CAsyncSocket::OnReceive(nErrorCode);
}
Example #4
0
//--------------------------------------------------------------------------------
bool CSmallSocket::NonBlockingMode(bool bOn)
	{
	DWORD nCmd = bOn ? 1 : 0;
	return IOCtl(FIONBIO, &nCmd);
	}
// We receive message from other application
//
void CConnexionSocket::OnReceive(int nErrorCode) 
{
	CString IP;
	UINT	Port;

	DWORD DataToRead;
	if( IOCtl( FIONREAD, &DataToRead )!=0 )
	{
		// Read data in the buffer
		if( m_BufferReceive )
		{
			char* BufferTemp = (char*) malloc( m_BufferReceiveSize+DataToRead );
			memcpy( BufferTemp, m_BufferReceive, m_BufferReceiveSize );
			free( m_BufferReceive );
			m_BufferReceive = BufferTemp;
		}
		else
		{
			m_BufferReceive = (char*) malloc( DataToRead );
			m_BufferReceiveSize = 0;
		}

		ReceiveFrom( &m_BufferReceive[m_BufferReceiveSize], DataToRead, IP, Port );
		m_BufferReceiveSize += DataToRead;

		// If we have the type and len of the message
		while( m_BufferReceiveSize>=sizeof(short)+sizeof(int) )
		{
			// Verify that the message is complete
			int Len;
			memcpy( &Len, &m_BufferReceive[sizeof(short)], sizeof(Len) );
			short Id;
			memcpy( &Id, m_BufferReceive, sizeof(Id) );

			//CString Str;
			//Str.Format( _T("Recu message. Taille attendu : %i / Taille recue : %i"), Len+6, m_BufferReceiveSize );
			//AfxMessageBox( Str );

			if( m_BufferReceiveSize>=(int) (Len+sizeof(short)+sizeof(int)) )
			{
				// Save the message in a file for debug
				{
					//CString Str, Str2;
					//Str.Format( _T("Message %i (len=%i) : "), (int) Id, Len );
					//for( int i=0; i<(int) (Len+sizeof(short)+sizeof(int)); i++ )
					//{
					//	Str2.Format( _T("%02x "), m_BufferReceive[i] );
					//	Str += Str2;
					//}
					//Str += _T("\n");
					//CStdioFile f(_T("c:\\tracelima.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText | CFile::shareDenyWrite );
					//f.SeekToEnd();
					//f.WriteString(Str);				
					//f.Close();
				}
				ReadAMessage( IP, Port );
			}
			else
				break;
		}
	}

	// Call the base class
	CSocket::OnReceive(nErrorCode);
}