.h

#pragma once
#ifndef __C_UDP_OBJECT_H__
#define __C_UDP_OBJECT_H__ #define OS_PLATFORM_WIN #include <string> #ifdef OS_PLATFORM_WIN #include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib") #else #include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//#include <sys/un.h>
//#include <netdb.h> #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() = ; 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 = { };
volatile int m_nLastSendTransferred = ;
volatile int m_nLastReceiveTransferred = ; private:
int m_nPort = ;
char m_szAddress[] = { }; 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\n", ToString().c_str());
};
virtual ~CUdpClient()
{
printf("dctor %s.\r\n", 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\n", ToString().c_str());
};
virtual ~CUdpServer()
{
printf("dctor %s.\r\n", 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 = { }; private:
std::string m_strEndPoint; private:
CUdpServer(const CUdpServer&);
CUdpServer& operator=(const CUdpServer&);
}; #endif // !__C_UDP_OBJECT_H__

.cpp

#include "UdpObject.h"

#include <cstdio>
#include <cstdlib>
#include <cstring> CUdpObject::CUdpObject()
{
#ifdef OS_PLATFORM_WIN
WSADATA stData;
WSAStartup(MAKEWORD(, ), &stData);
#else
#endif // !OS_PLATFORM_WIN m_sktUdpObject = socket(AF_INET, SOCK_DGRAM, /*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, , (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, , (struct sockaddr*)&sktAddress, &nSktAddressSize); return m_nLastReceiveTransferred;
} bool CUdpClient::IsConnect()
{
return m_nLastSendTransferred >= || m_nLastReceiveTransferred >= ;
} 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 <cstring>
#include <iostream> #include "UdpObject.h" using namespace std; //int cudp_test()
int main()
{
char szBuffer[] = { }; CUdpServer server;
server.SetParameter(); {
CUdpClient client;
client.SetParameter(, "192.168.1.76"); std::strcpy(szBuffer, "abcedfe");
std::cout << "Client Send: " << szBuffer << std::endl;
client.SendTo(szBuffer, std::strlen(szBuffer)); memset(szBuffer, , 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, , sizeof(szBuffer));
client.ReceiveFrom(szBuffer, sizeof(szBuffer));
std::cout << "Client Receive : " << szBuffer << std::endl; std::cout << client.IsConnect() << std::endl;
} {
CUdpClient client;
client.SetParameter(, "192.168.1.76"); std::strcpy(szBuffer, "aassasaassasasasasaaas");
std::cout << "Client Send: " << szBuffer << std::endl;
client.SendTo(szBuffer, std::strlen(szBuffer)); memset(szBuffer, , 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, , 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 ;
}

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 ]; then
dirBuildShell="../$1/"
rm -rf "${dirBuildShell}"
fi #
if [ ! -d "${dirBuildShell}" ]; then
mkdir "${dirBuildShell}"
cd "${dirBuildShell}"
fi #
cmake ../Test/ && make

C++ 简单的UDP客户端与服务端的更多相关文章

  1. [Java]Hessian客户端和服务端代码例子

    简要说明:这是一个比较简单的hessian客户端和服务端,主要实现从客户端发送指定的数据量到服务端,然后服务端在将接收到的数据原封不动返回到客户端.设计该hessian客户端和服务端的初衷是为了做一个 ...

  2. Socket通信客户端和服务端代码

    这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.G ...

  3. linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)

    单客户端和服务端的通信(基于UDP)   代码 服务端代码socket3.c #include<sys/types.h> #include<sys/socket.h> #inc ...

  4. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  5. Java实现UDP之Echo客户端和服务端

    Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  6. asp.net 简单记录请求的客户端和服务端 处理时间

    最近项目需要简单记录一下 ajax客户端和服务端处理时间,服务端时间的思路是借用BeginRequest和EndRequest事件,为了不影响现有接口返回的数据格式,因此服务处理时间放在respons ...

  7. QUdpSocket-Qt使用Udp通讯实现服务端和客户端

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QUdpSocket-Qt使用Udp通讯实现服务端和客户端     本文地址:https:// ...

  8. 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

    UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...

  9. Netty入门——客户端与服务端通信

    Netty简介Netty是一个基于JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性.换句话说,Netty是一个NIO框架,使用它可以简单快速 ...

随机推荐

  1. Java实现LeetCode_0009_PalindromeNumber

    package javaLeetCode_primary; import java.util.Scanner; import java.util.Stack; public class Palindr ...

  2. Linux 服务管理-服务分类

    Linux中的服务根据安装方法的不同可以分为RPM包默认安装的服务和源码包安装的服务,而RPM包安装的服务又依据启动和自启动的不同分为独立服务和基于xinetd服务. 查看已经安装的服务 查看所有RP ...

  3. tensorflow2.0学习笔记第一章第一节

    一.简单的神经网络实现过程 1.1张量的生成 # 创建一个张量 #tf.constant(张量内容,dtpye=数据类型(可选)) import tensorflow as tf import num ...

  4. InstallShield 2015 Limited Edition 打包教程

    InstallShield 2015 Limited Edition 打包教程 右键解决方案,新增项目,选择其他项目类型,安装和部署. InstallShield2015可以免费使用,但需要下载.安装 ...

  5. 离职冷静期文件.doc

    <中华人民共和国民法典>通过十三届全国人大三次会议表决,将于2021年1月1日起施行,其中#离婚冷静期#备受关注.多方人士表示,离婚冷静期设立的出发点,不是对婚姻自由的一种破坏,而是让当事 ...

  6. [PyQt5]文件对话框QFileDialog的使用

    概述选取文件夹 QFileDialog.getExistingDirectory()选择文件 QFileDialog.getOpenFileName()选择多个文件 QFileDialog.getOp ...

  7. # 详细了解HTML5中的form表单

    4.规范使用 <form>元素用于组织所有表单部件(也称为控件或字段),负责告诉浏览器把数据提交到哪里,方法是在action属性中提供一个URL.加入你只是想在客户端使用JavaScrip ...

  8. Mysq数据库索引(B-Tree索引)

    一.B-Tree索引的底层结构 所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同,如图所示,B-Tree索引的底层数据结构一般是B+树,反应了MyISAM索引是如何工作的.     二.B-T ...

  9. c++ UDP套接字服务器端代码示范

    c++ UDP套接字服务器端代码示范 #include<winsock2.h> //包含头文件 #include<stdio.h> #include<windows.h& ...

  10. 【Python爬虫】HTTP基础和urllib库、requests库的使用

    引言: 一个网络爬虫的编写主要可以分为三个部分: 1.获取网页 2.提取信息 3.分析信息 本文主要介绍第一部分,如何用Python内置的库urllib和第三方库requests库来完成网页的获取.阅 ...