C++簡単なUDPクライアントとサービス
25800 ワード
.h
.cpp
.test.cpp
CMakeLists.txt
.build.sh
転載先:https://www.cnblogs.com/wjshan0808/p/9264731.html
#pragma once
#ifndef __C_UDP_OBJECT_H__
#define __C_UDP_OBJECT_H__
#define OS_PLATFORM_WIN
#include <string>
#ifdef OS_PLATFORM_WIN
#include
#pragma comment(lib, "ws2_32.lib")
#else
#include
#include
#include
#include in.h>
#include
//#include
//#include
#endif // !OS_PLATFORM_WIN
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);
public:
virtual const std::string& ToString() = 0;
protected:
virtual struct sockaddr_in& SocketAddress();
protected:
#ifdef OS_PLATFORM_WIN
SOCKET m_sktUdpObject;
#else
int m_sktUdpObject;
#endif // !OS_PLATFORM_WIN
struct sockaddr_in m_sktUdpObjectAddress = { 0 };
volatile int m_nLastSendTransferred = 0;
volatile int m_nLastReceiveTransferred = 0;
private:
int m_nPort = 0;
char m_szAddress[32] = { 0 };
private:
CUdpObject(const CUdpObject&);
CUdpObject& operator=(const CUdpObject&);
};
class CUdpClient : public CUdpObject
{
public:
CUdpClient()
{
m_strEndPoint = "C:" + std::to_string(m_sktUdpObject);
printf("ctor %s.\r
", ToString().c_str());
};
virtual ~CUdpClient()
{
printf("dctor %s.\r
", ToString().c_str());
};
public:
virtual bool IsConnect();
public:
virtual const std::string& ToString() override;
private:
std::string m_strEndPoint;
private:
CUdpClient(const CUdpClient&);
CUdpClient& operator=(const CUdpClient&);
};
//Single Client
class CUdpServer : public CUdpObject
{
public:
CUdpServer()
{
m_strEndPoint = "S:" + std::to_string(m_sktUdpObject);
printf("ctor %s.\r
", ToString().c_str());
};
virtual ~CUdpServer()
{
printf("dctor %s.\r
", ToString().c_str());
};
public:
void SetParameter(int nPort, const char* szAddress = nullptr) override;
public:
struct sockaddr_in & SocketAddress() override;
public:
virtual const std::string& ToString() override;
private:
struct sockaddr_in m_sktAddressClient = { 0 };
private:
std::string m_strEndPoint;
private:
CUdpServer(const CUdpServer&);
CUdpServer& operator=(const CUdpServer&);
};
#endif // !__C_UDP_OBJECT_H__
.cpp
#include "UdpObject.h"
#include
#include
#include
CUdpObject::CUdpObject()
{
#ifdef OS_PLATFORM_WIN
WSADATA stData;
WSAStartup(MAKEWORD(2, 2), &stData);
#else
#endif // !OS_PLATFORM_WIN
m_sktUdpObject = socket(AF_INET, SOCK_DGRAM, 0/*IPPROTO_UDP, IPPROTO_UDPLITE*/);
}
CUdpObject::~CUdpObject()
{
#ifdef OS_PLATFORM_WIN
closesocket(m_sktUdpObject);
WSACleanup();
#else
//shutdown(m_sktUdpObject, SHUT_RDWR);
close(m_sktUdpObject);
#endif // !OS_PLATFORM_WIN
}
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;
}
}
struct sockaddr_in& CUdpObject::SocketAddress()
{
return m_sktUdpObjectAddress;
}
int CUdpObject::SendTo(const char* szData, int nDataLength)
{
struct sockaddr_in& sktAddress = SocketAddress();
#ifdef OS_PLATFORM_WIN
int nSktAddressSize = sizeof(sktAddress);
#else
socklen_t nSktAddressSize = sizeof(sktAddress);
#endif // !OS_PLATFORM_WIN
m_nLastSendTransferred = sendto(m_sktUdpObject, szData, nDataLength, 0, (const struct sockaddr*)&sktAddress, sizeof(sktAddress));
return m_nLastSendTransferred;
}
int CUdpObject::ReceiveFrom(char* szBuffer, int nBufferSize)
{
struct sockaddr_in& sktAddress = SocketAddress();
#ifdef OS_PLATFORM_WIN
int nSktAddressSize = sizeof(sktAddress);
#else
socklen_t nSktAddressSize = sizeof(sktAddress);
#endif // !OS_PLATFORM_WIN
m_nLastReceiveTransferred = recvfrom(m_sktUdpObject, szBuffer, nBufferSize, 0, (struct sockaddr*)&sktAddress, &nSktAddressSize);
return m_nLastReceiveTransferred;
}
bool CUdpClient::IsConnect()
{
return m_nLastSendTransferred >= 0 || m_nLastReceiveTransferred >= 0;
}
const std::string& CUdpClient::ToString()
{
return m_strEndPoint;
}
void CUdpServer::SetParameter(int nPort, const char* szAddress)
{
CUdpObject::SetParameter(nPort, nullptr);
bind(m_sktUdpObject, (const struct sockaddr*)&m_sktUdpObjectAddress, sizeof(m_sktUdpObjectAddress));
}
struct sockaddr_in& CUdpServer::SocketAddress()
{
return m_sktAddressClient;
}
const std::string& CUdpServer::ToString()
{
return m_strEndPoint;
}
.test.cpp
#include
#include
#include "UdpObject.h"
using namespace std;
//int cudp_test()
int main()
{
char szBuffer[128] = { 0 };
CUdpServer server;
server.SetParameter(60001);
{
CUdpClient client;
client.SetParameter(60001, "192.168.1.76");
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;
std::cout << client.IsConnect() << std::endl;
}
{
CUdpClient client;
client.SetParameter(60001, "192.168.1.76");
std::strcpy(szBuffer, "aassasaassasasasasaaas");
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, "vdvdvdvdvdvdvdvdvdv");
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;
std::cout << client.IsConnect() << std::endl;
}
std::cout << "Done." << std::endl;
getchar();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.5)
project(upd_test)
set(TARGET ${PROJECT_NAME})
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../../Release/)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_definitions(-DOS_PLATFORM_UNIX)
add_executable(${TARGET} UdpObject.cpp Test_UdpObject.cpp)
target_link_libraries(${TARGET})
.build.sh
#! /bin/sh
#
dirBuildShell="../Temp/"
#
if [ -d "${dirBuildShell}" ]; then
rm -rf "${dirBuildShell}"
fi
#
if [ $# -ge 1 ]; then
dirBuildShell="../$1/"
rm -rf "${dirBuildShell}"
fi
#
if [ ! -d "${dirBuildShell}" ]; then
mkdir "${dirBuildShell}"
cd "${dirBuildShell}"
fi
#
cmake ../Test/ && make
転載先:https://www.cnblogs.com/wjshan0808/p/9264731.html