学习Linux网络编程

来源:互联网 发布:网站流量提升软件 编辑:程序博客网 时间:2024/03/28 17:03
//xsocket.h
#ifndef _X_SOCKET_H_
#define _X_SOCKET_H_
#include <xcommon.h>
#if CONFIG_VC || CONFIG_BCB
    #include <WINSOCK2.H>
    #include <io.h>
#elif CONFIG_GCC
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <sys/wait.h>
    #include <arpa/inet.h>
#endif

    using namespace zdh;

    class XSocket
    {
    public:
        XSocket(int SocketType);
        virtual ~XSocket();
        int GetSockFD() const { return m_SockFD; }
        int GetSocketType() const { return m_SocketType; }
        XWord GetSocketRemotePort() const { return m_RemotePort; }
        XWord GetSocketLocalPort() const { return m_LocalPort; }
        const XString & GetSocketLocalAddress() const { return m_LocalAddress; }
        const XString & GetSocketRemoteAddress() const { return m_RemoteAddress; }
        void SetLocalAddress(const XString & aLocalAddress, XWord aLocalPort);
        void SetRemoteAddress(const XString & aRemoteAddress, XWord aRemotePort);
        void Open();
        void Close();
        XInt SendData(const void * aData,XInt iDataLength);
        static void WSAInitializer();
        static void WSAClose();
    private:
        int m_SockFD;
        int m_SocketType;
        XWord m_RemotePort;
        XWord m_LocalPort;
        XString m_RemoteAddress;
        XString m_LocalAddress;
        sockaddr_in m_RemoteAddr;
    #if CONFIG_VC || CONFIG_BCB
        static WSADATA m_wsadata;
    #endif
    };
 
#endif
//xsocket.cpp
#include "xsocket.h"
#include <assert.h>
    using namespace zdh;
    XSocket::XSocket(int SocketType)
        :m_SocketType(SocketType),
        m_SockFD(-1)
    {
    }
    XSocket::~XSocket()
    {
        Close();
    }
    void XSocket::SetLocalAddress(const XString & aLocalAddress, XWord aLocalPort)
    {
        m_LocalAddress = aLocalAddress;
        m_LocalPort = aLocalPort;
    }
    void XSocket::SetRemoteAddress(const XString & aRemoteAddress, XWord aRemotePort)
    {
        m_RemoteAddress = aRemoteAddress;
        m_RemotePort = aRemotePort;
        m_RemoteAddr.sin_addr.s_addr = inet_addr(m_RemoteAddress.c_str());
        m_RemoteAddr.sin_port = htons(m_RemotePort);
        m_RemoteAddr.sin_family = AF_INET;
        for(int i=0;i<8;i++) m_RemoteAddr.sin_zero[i] = 0;
    }
    void XSocket::Open()
    {
        m_SockFD = socket(AF_INET,m_SocketType,0);
    }
    void XSocket::Close()
    {
        if( m_SockFD != -1 )
        {
            close(m_SockFD);
            m_SockFD = -1;
        }
    }
    XInt XSocket::SendData(const void * aData,XInt iDataLength)
    {
        XInt iRet = sendto(m_SockFD,(const char *)aData,iDataLength,0,(struct sockaddr *)&m_RemoteAddr,sizeof(struct sockaddr));
        return iRet;
    }
    void XSocket::WSAInitializer()
    {
    #if CONFIG_BCB || CONFIG_VC
        WSAStartup( 0x101, &m_wsadata );
    #endif
    }
    void XSocket::WSAClose()
    {
    #if CONFIG_BCB || CONFIG_VC
        WSACleanup();
    #endif
    }
    //定义类静态变量
    #if CONFIG_BCB || CONFIG_VC
    WSADATA XSocket::m_wsadata;
    #endif
 
//上述代码已在Linux下与VC下编译并运行过!