C++ 简单的UDP客户端与服务端

 
#include <cstring>
#include <iostream>
#include <ctime>
#include <list>
#include <iostream>
#include <vector>
#include <chrono>
#include <thread>
#include <basetsd.h>

#include "CUdp.h"

using namespace std;
 


//int cudp_test()
int main()
{
    char szBuffer[32] = { 0 };

    CUdpServer server;
    server.SetParameter(60001);

    CUdpClient client;
    client.SetParameter(60001, "192.168.1.135");


    std::strcpy(szBuffer, "abcedfe");
    std::cout << "Client Send: " << szBuffer << std::endl;
    client.SendTo(szBuffer, std::strlen(szBuffer));
    

    memset(szBuffer, 0, sizeof(szBuffer));
    server.ReceiveFrom(szBuffer, sizeof(szBuffer));
    std::cout <<"Server Receive : " << szBuffer << std::endl;


    std::strcpy(szBuffer, "daaaaaaaaaaaaaaaaa");
    std::cout << "Server Send: " << szBuffer << std::endl;
    server.SendTo(szBuffer, std::strlen(szBuffer));
    

    memset(szBuffer, 0, sizeof(szBuffer));
    client.ReceiveFrom(szBuffer, sizeof(szBuffer));
    std::cout << "Client Receive : " << szBuffer << std::endl;
    
    //a.Start();
    getchar();

    return 0;
}
#include "CUdp.h"

#include <cstdlib>
#include <cstring>


CUdpObject::CUdpObject()
{
    WSADATA stData;
    WSAStartup(MAKEWORD(2, 2), &stData);

    m_sktUdpObject = socket(AF_INET, SOCK_DGRAM, 0/*IPPROTO_UDP*/);
}
CUdpObject::~CUdpObject()
{
    closesocket(m_sktUdpObject);
    WSACleanup();
}

void CUdpObject::SetParameter(int nPort, const char* szAddress)
{
    m_nPort = nPort;

    m_sktUdpObjectAddress.sin_family = AF_INET;
    m_sktUdpObjectAddress.sin_port = htons(m_nPort);

    if (nullptr != szAddress)
    {
        std::strcpy(m_szAddress, szAddress);
        m_sktUdpObjectAddress.sin_addr.s_addr = inet_addr(m_szAddress);
    }
    else
    {
        m_sktUdpObjectAddress.sin_addr.s_addr = INADDR_ANY;
    }
}

sockaddr_in& CUdpObject::SocketAddress()
{
    return m_sktUdpObjectAddress;
}

int CUdpObject::SendTo(const char* szData, int nDataLength)
{
    sockaddr_in& sktAddress = SocketAddress();

    int nTransferred = sizeof(sktAddress);

    int nReturn = sendto(m_sktUdpObject, szData, nDataLength, 0, (const sockaddr*)&sktAddress, nTransferred);

    if (SOCKET_ERROR == nReturn)
        return S_FALSE;
    return S_OK;
}

int CUdpObject::ReceiveFrom(char* szBuffer, int nBufferSize)
{
    sockaddr_in& sktAddress = SocketAddress();

    int nTransferred = sizeof(sktAddress);

    int nReturn = recvfrom(m_sktUdpObject, szBuffer, nBufferSize, 0, (sockaddr*)&sktAddress, &nTransferred);

    if (SOCKET_ERROR == nReturn)
        return S_FALSE;
    return S_OK;
}


void CUdpServer::SetParameter(int nPort, const char* szAddress)
{
    CUdpObject::SetParameter(nPort, nullptr);

    bind(m_sktUdpObject, (const sockaddr*)&m_sktUdpObjectAddress, sizeof(m_sktUdpObjectAddress));
}

sockaddr_in& CUdpServer::SocketAddress()
{
    return m_sktAddressClient;
}
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")


class CUdpObject
{
protected:
    CUdpObject();
    virtual ~CUdpObject();

public:
    virtual void SetParameter(int nPort, const char* szAddress = nullptr);

public:
    virtual int SendTo(const char* szData, int nDataLength);
    virtual int ReceiveFrom(char* szBuffer, int nBufferSize);

protected:
    virtual sockaddr_in& SocketAddress();

protected:
    int m_nPort = 0;
    SOCKET m_sktUdpObject;
    char m_szAddress[32] = { 0 };
    sockaddr_in m_sktUdpObjectAddress = { 0 };
};


class CUdpClient : public CUdpObject
{
public:
    CUdpClient() : m_bIsConnect(true)
    {
    };
    virtual ~CUdpClient()
    {
    };

public:
    bool m_bIsConnect;
};


//Single Client
class CUdpServer : public CUdpObject
{
public:
    CUdpServer() 
    {
    };
    virtual ~CUdpServer()
    {
    };

public:
    void SetParameter(int nPort, const char* szAddress = nullptr) override;

public:
    sockaddr_in& SocketAddress() override;

private:
    sockaddr_in m_sktAddressClient = { 0 };
};

 /* 格式乱了 */

猜你喜欢

转载自www.cnblogs.com/wjshan0808/p/9264731.html