Socket封装9

struct CommandHeader
{
    char CommandTag[4];     // 4
    WORD CommandVersion;    // 2
    WORD CommandID;         // 2
    DWORD RequestID;        // 4
    DWORD SendTime;         // 4
    DWORD RequestIP;        // 4
    DWORD DataLen;          // 4

    CommandHeader()
    {
        //memcpy(CommandTag, "SLan", 4);
        memset(CommandTag, 0, 4);
        CommandVersion = 0;
        CommandID = 0;
        RequestID = 0;
        SendTime = 0;
        RequestIP = 0;
        DataLen = 0;
    }

   CommandHeader(constCommandHeader& header)
    {
        *this = header;
    }
    CommandHeader& operator = (const CommandHeader& header)
    {
        memcpy(CommandTag, header.CommandTag, 4);
        CommandVersion = header.CommandVersion;
        CommandID = header.CommandID;
        RequestID = header.RequestID;
        SendTime = header.SendTime;
        RequestIP = header.RequestIP;
        DataLen = header.DataLen;

        return *this;
    }
};

 

#ifndef SOCKETHELPER_H
#define SOCKETHELPER_H


// #include <standard library headers>
#include <string>
#include <vector>
#include <algorithm>

class SocketHelper
{
private:
    SocketHelper();
    virtual ~SocketHelper();

public:
    static std::string GetHostIPAddress();

    static DWORD TransferIp(const std::string& ip);
    static DWORD TransferIp(const std::wstring& ip);
    static std::string TransferIp(DWORD ip);
    static std::wstring IpToWstring(DWORD ip);

    static DWORD NetToHostL(char* n);
    static WORD NetToHostS(char* n);


    static void HostToNet(char* n, DWORD h);
    static void HostToNet(char* n, WORD h);
    static std::vector<char> HostToNet(DWORD h);
    static std::vector<char> HostToNet(WORD h);

    static void SafeCopyUtf8(char* d, const std::string& str, int size);
    static void SafeCopyUtf8(char* d, const std::wstring& str, int size);
    static std::vector<char> SafeCopyUtf8(const std::string& str, int size);
    static std::vector<char> SafeCopyUtf8(const std::wstring& str, int size);

    static std::wstring SafeTransUtf8(const char* d, int size);
   
    template <typename T> static bool Equal(const T& t1, const T& t2) { return (t1 == t2); }
    template <typename T> static bool Equal(const std::list<T>& t1, const std::list<T>& t2)
    {
        if (t1.size() != t2.size())
        {
            return false;
        }
        for (std::list<T>::const_iterator it = t1.begin(); it != t1.end(); ++it)
        {
            const T& t = *it;
            if (std::find(t2.begin(), t2.end(), t) == t2.end())
            {
                return false;
            }
        }
        return true;
    }

};

 

//

// #include "customer headers"
#include "sock/Socket.h"
#include "util/encode.h"
#include "util/algo.h"
#include "SocketHelper.h"



std::string SocketHelper::GetHostIPAddress()
{
    struct hostent *theHost = NULL;
    struct in_addr in;
    char pMyName[80];
    char *ptr = NULL;
    WORD wVersionRequested;
    WSADATA wsaData;
    int nErr;
    wVersionRequested = MAKEWORD(2, 0);
    nErr = WSAStartup( wVersionRequested, &wsaData);
    if (nErr != 0)
    {
        return "";
    }
    if (LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 0)
    {
        WSACleanup();
        return "";
    }
    if (gethostname(pMyName, 80) == SOCKET_ERROR)
    {
        WSACleanup();
        return "";
    }
    theHost = gethostbyname(pMyName);
    if (!theHost)
    {
        WSACleanup();
        return "";
    }
    memset((void *)&in, 0, sizeof(in));
    in.s_addr = *((DWORD *)theHost->h_addr_list[0]);
    ptr = inet_ntoa(in);
    if (!ptr)
    {
        WSACleanup();
        return "";
    }
    WSACleanup();
    return std::string(ptr);   
}


DWORD SocketHelper::TransferIp(const std::string& ip)
{
    return inet_addr(ip.c_str());
}


DWORD SocketHelper::TransferIp(const std::wstring& ip)
{
    return TransferIp(util::encode::ConvertToAscii(ip));
}


std::string SocketHelper::TransferIp(DWORD ip)
{
    in_addr addr;
    addr.s_addr = ip;
    return inet_ntoa(addr);
}


std::wstring SocketHelper::IpToWstring(DWORD ip)
{
    return util::encode::ConvertToWstring(SocketHelper::TransferIp(ip));
}


DWORD SocketHelper::NetToHostL(char* n)
{
    assert(n != NULL);

    DWORD* data = (DWORD*)n;
    return ntohl(*data);
}


WORD SocketHelper::NetToHostS(char* n)
{
    assert(n != NULL);

    unsigned short* data = (unsigned short*)n;
    return ntohs(*data);
}


void SocketHelper::HostToNet(char* n, DWORD h)
{
    assert(n != NULL);

    DWORD d = htonl(h);
    memcpy(n, &d, 4);
}


void SocketHelper::HostToNet(char* n, WORD h)
{
    assert(n != NULL);

    WORD d = htons(h);
    memcpy(n, &d, 2);
}


std::vector<char> SocketHelper::HostToNet(DWORD h)
{
    DWORD d = htonl(h);

    std::vector<char> n(4, 0);
    memcpy(&n[0], &d, 4);

    return n;
}


std::vector<char> SocketHelper::HostToNet(WORD h)
{
    WORD d = htons(h);

    std::vector<char> n(2, 0);
    memcpy(&n[0], &d, 2);

    return n;
}


std::vector<char> SocketHelper::HostToNet(const CommandHeader& header)
{
    std::vector<char> data(HEADER_LENGTH, '/0');

    memcpy(&data[0], &header.CommandTag, 4);
    HostToNet(&data[4], header.CommandVersion);
    HostToNet(&data[6], header.CommandID);
    HostToNet(&data[8], header.RequestID);
    HostToNet(&data[12], header.SendTime);
    HostToNet(&data[16], header.RequestIP);
    HostToNet(&data[20], header.DataLen);

    return data;
}

 


CommandHeader SocketHelper::NetToHostHeader(char* data)
{
    assert(data != NULL);

    CommandHeader header;

    memcpy(&header.CommandTag, &data[0], 4);
    header.CommandVersion = NetToHostS(&data[4]);
    header.CommandID = NetToHostS(&data[6]);
    header.RequestID = NetToHostL(&data[8]);
    header.SendTime = NetToHostL(&data[12]);
    header.RequestIP = NetToHostL(&data[16]);
    header.DataLen = NetToHostL(&data[20]);

    return header;
}

 

void SocketHelper::SafeCopyUtf8(char* d, const std::string& str, int size)
{
    assert(d != NULL);

    size_t si = static_cast<size_t>(size);
    size_t s = (str.size() > si) ? si : str.size();

    memset(d, 0, size);
    memcpy(d, str.c_str(), s);
}


void SocketHelper::SafeCopyUtf8(char* d, const std::wstring& str, int size)
{
    assert(d != NULL);

    std::string utf8 = util::encode::ConvertToUtf8(str);
    SafeCopyUtf8(d, utf8, size);
}


std::vector<char> SocketHelper::SafeCopyUtf8(const std::string& str, int size)
{
    std::vector<char> ret(size, '/0');
    SafeCopyUtf8(&ret[0], str, size);

    return ret;
}


std::vector<char> SocketHelper::SafeCopyUtf8(const std::wstring& str, int size)
{
    std::string utf8 = util::encode::ConvertToUtf8(str);
    return SafeCopyUtf8(utf8, size);
}


std::wstring SocketHelper::SafeTransUtf8(const char* d, int size)
{
    assert(d != NULL);

    char* data = new char[size + 1];
    memset(data, 0, size + 1);
    memcpy(data, d, size);
   
    std::wstring strRet = util::encode::ConvertUtf8ToWstring(data);
    delete []data;
    data = NULL;

    return strRet;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值