⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socket.cpp

📁 一个普通的mount工具,能过CIFS协议来挂载盘符
💻 CPP
字号:
#ifndef WINNT

#include <portable.h>
#include <__trace.h>

#else

#define	WIN_KERNEL_MODE

extern "C"
{
#include <ntddk.h>
}

#include <KWin32.h>
#include <unisock.h>

#endif

#include "socket.hpp"

#ifndef WINNT

ClServerSocket::ClServerSocket( const char * szServerIP, int nPort )
{
    struct sockaddr_in LocalAddress;

    LocalAddress.sin_family = AF_INET;
    LocalAddress.sin_addr.s_addr = ::inet_addr( szServerIP? szServerIP: "127.0.0.1" );
    LocalAddress.sin_port = ::htons( nPort );

    m_Socket = ::socket( AF_INET, SOCK_STREAM, 0 ); // TCP socket
    if ( m_Socket == INVALID_SOCKET )
    {
        TRACE_PRINTF( ("ClServerSocket::ClServerSocket( %s, %d ) Failed to create socket\n", szServerIP, nPort) );
        throw XFailedToCreate();
    }

    if ( ::bind( m_Socket, (struct sockaddr*)&LocalAddress, sizeof(LocalAddress) ) == SOCKET_ERROR )
    {
        TRACE_PRINTF( ("ClServerSocket::ClServerSocket( %s, %d ) Failed to bind socket\n", szServerIP, nPort) );
        throw XFailedToCreate();
    }

    if ( ::listen( m_Socket, 5 ) == SOCKET_ERROR ) 
    {
        TRACE_PRINTF( ("ClServerSocket::ClServerSocket( %s, %d ) Failed to begin listenning\n", szServerIP, nPort) );
        throw XFailedToCreate();
    }
}

ClServerSocket::~ClServerSocket()
{
    ::closesocket( m_Socket );
}

int ClServerSocket::Do(void)
{
    while( TRUE )
    {
        struct sockaddr ConnectingClient;
        int nAddrLength = sizeof(ConnectingClient);

        St_Connection * pstConnection = new St_Connection;

        pstConnection->m_pServer = this;
        pstConnection->m_Client = ::accept( m_Socket, &ConnectingClient, &nAddrLength );
        if ( pstConnection->m_Client == INVALID_SOCKET )
        {
            delete pstConnection;
            TRACE_PRINTF( ("ClServerSocket::Do Failed\n") );
            return -1;
        }

        AddConnection( pstConnection );
        pstConnection->m_hThread = ::CreateThread( 
            NULL, 0, ConnectionThread, pstConnection, 0, &pstConnection->m_dwThread );
    }

    return 0;
}

void ClServerSocket::AddConnection( St_Connection * pstConnection )
{
    ClMutualExclusiveAccess AccessNow(m_ConnectionsLock);

    m_lstConnections.add( pstConnection );
}

BOOL ClServerSocket::RemoveConnection( ClWinSocket Connection )
{
    ClMutualExclusiveAccess AccessNow(m_ConnectionsLock);

    for( ST_ListContainerIt<St_Connection> it = m_lstConnections;
         it; it ++ )
    {
        if( (*it)->m_Client == Connection )
        {
            it.remove();
            return TRUE;
        }
    }

    return FALSE;
}

BOOL ClServerSocket::QueryConnection( ClWinSocket Connection, St_Connection & Info )
{
    ClMutualExclusiveAccess AccessNow(m_ConnectionsLock);

    for( ST_ListContainerIt<St_Connection> it = m_lstConnections;
         it; it ++ )
    {
        if( (*it)->m_Client == Connection )
        {
            Info = **it;
            return TRUE;
        }
    }

    return FALSE;
}

DWORD WINAPI ClServerSocket::ConnectionThread( LPVOID pParameter )
{
    St_Connection * pstConnection = (St_Connection *)pParameter;
    ClServerSocket * pServer = pstConnection->m_pServer;
    ClWinSocket Client = pstConnection->m_Client;
    pServer->OnConnect( Client );
    ::closesocket( Client );

    pServer->RemoveConnection( Client );

    return 0;
}

#endif

ClClientSocket::ClClientSocket()
{
    m_Socket = ::socket( AF_INET, SOCK_STREAM, 0 );
    if( m_Socket < 0 )
    {
        TRACE_PRINTF( ("ClClientSocket::ClClientSocket() Failed\n") );
    }
}

ClClientSocket::~ClClientSocket()
{
	if( m_Socket >= 0 )
	{
		::closesocket( m_Socket );
	}
}

namespace namWinSocket
{
    BOOL GetSocketAddress( LPCSTR szIPAddress, struct sockaddr_in & SocketAddress )
    {
        ULONG uInetAddr = ::inet_addr( szIPAddress );
	    memset( &SocketAddress, 0, sizeof(SocketAddress) );
        SocketAddress.sin_family = AF_INET;
        SocketAddress.sin_addr.S_un.S_addr = uInetAddr;

        return TRUE;
    }

    BOOL ReceiveStream( SOCKET Socket, PVOID pBuffer, size_t n )
    {
        size_t nTotal = 0;
        size_t nRemain = n;
        
        while( nRemain )
        {
            int nReceived = ::recv( Socket, (LPSTR)pBuffer, nRemain, 0 );
            if( nReceived == 0 )
            {
		        TRACE_PRINTF( ("namWinSocket::ReceiveStream: The connection is disconnected\n") );
		        return FALSE;
            }

	        if( nReceived == SOCKET_ERROR )
	        {
		        TRACE_PRINTF( ("namWinSocket::ReceiveStream: Failed to receive %d bytes data\n", n) );
		        return FALSE;
	        }


            nRemain -= nReceived;
            nTotal += nReceived;
            pBuffer = (BYTE *)pBuffer + nReceived;
        }

        return TRUE;
    }

    BOOL SendStream( SOCKET Socket, PVOID pBuffer, size_t n )
    {
        int nSent = ::send( Socket, (LPCSTR)pBuffer, n, 0 );

        if( nSent == SOCKET_ERROR )
        {
		    TRACE_PRINTF( ("namWinSocket::SendStream: Failed to send %d bytes data\n", n) );
            return FALSE;
        }

        if( (size_t)nSent != n )
        {
		    TRACE_PRINTF( ("namWinSocket::SendStream: Failed to send %d bytes data, sent %d bytes\n", n, nSent) );
            return FALSE;
        }
        return TRUE;
    }
    
};  //  namespace WinSocket

BOOL ClClientSocket::connect( const char * szServerIP, int nPort )
{
    struct sockaddr_in ServerAddr;
    if( !namWinSocket::GetSocketAddress( szServerIP, ServerAddr ) )
    {
        TRACE_PRINTF( ("ClClientSocket::connect( %s, %d ): Failed to get socket address\n", szServerIP, nPort) );
        return FALSE;
    }
    ServerAddr.sin_port = htons( nPort );

    if( ::connect( m_Socket, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr) ) != 0 )
    {
        TRACE_PRINTF( ("ClClientSocket::connect( %s, %d ): Failed to connect\n", szServerIP, nPort) );
        return FALSE;
    }

    return TRUE;
}

BOOL ClClientSocket::connect( struct sockaddr_in SocketAddr, int nPort )
{
    SocketAddr.sin_port = ::htons( nPort );
    if( ::connect( m_Socket, (struct sockaddr*)&SocketAddr, sizeof(SocketAddr) ) != 0 ) 
    {
        TRACE_PRINTF( ("ClClientSocket::connect( , %d ): Failed to connect\n", nPort) );
        return FALSE;
    }

    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -