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; }
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); }
//-------------------------------------------------------------------------------- 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); }