.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 459 重复的子字符串

    459. 重复的子字符串 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" ...

  2. Java实现 LeetCode 384 打乱数组

    384. 打乱数组 打乱一个没有重复元素的数组. 示例: // 以数字集合 1, 2 和 3 初始化数组. int[] nums = {1,2,3}; Solution solution = new ...

  3. Java实现 LeetCode 151 翻转字符串里的单词

    151. 翻转字符串里的单词 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky th ...

  4. Java实现 LeetCode 62 不同路径

    62. 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中 ...

  5. 第四届蓝桥杯JavaC组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学. ...

  6. Java实现第九届蓝桥杯快速排序

    快速排序 以下代码可以从数组a[]中找出第k小的元素. 它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的. 请仔细阅读分析源码,填写划线部分缺失的内容. package bb; impor ...

  7. Linux 工作管理

    把进程放入后台 进程后加&,这时,进程在后台是运行的 tar -zcf etc.tar.gz /etc & 在执行程序时,快速按下ctrl+z快捷键,这时,进程在后台是停止的 查看后台 ...

  8. MySQL基本DML

    DML: 数据操纵语言, 主要用来向数据库中添加. 删除. 修改数据用的.在开发中经常会用到,所以,在此也小小总结一下: CREATE DATABASE db2 DEFAULT CHARSET UTF ...

  9. MATLAB实例:聚类网络连接图

    MATLAB实例:聚类网络连接图 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 本文给出一个简单实例,先生成2维高斯数据,得到数据之后,用模糊C均值( ...

  10. Python爬虫小白入门(一)入门介绍

    一.前言 你是不是在为想收集数据而不知道如何收集而着急? 你是不是在为想学习爬虫而找不到一个专门为小白写的教程而烦恼? Bingo! 你没有看错,这就是专门面向小白学习爬虫而写的!我会采用实例的方式, ...