C++ 简单的UDP客户端与服务端
.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客户端与服务端的更多相关文章
- [Java]Hessian客户端和服务端代码例子
简要说明:这是一个比较简单的hessian客户端和服务端,主要实现从客户端发送指定的数据量到服务端,然后服务端在将接收到的数据原封不动返回到客户端.设计该hessian客户端和服务端的初衷是为了做一个 ...
- Socket通信客户端和服务端代码
这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.G ...
- linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)
单客户端和服务端的通信(基于UDP) 代码 服务端代码socket3.c #include<sys/types.h> #include<sys/socket.h> #inc ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- asp.net 简单记录请求的客户端和服务端 处理时间
最近项目需要简单记录一下 ajax客户端和服务端处理时间,服务端时间的思路是借用BeginRequest和EndRequest事件,为了不影响现有接口返回的数据格式,因此服务处理时间放在respons ...
- QUdpSocket-Qt使用Udp通讯实现服务端和客户端
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QUdpSocket-Qt使用Udp通讯实现服务端和客户端 本文地址:https:// ...
- 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例
UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...
- Netty入门——客户端与服务端通信
Netty简介Netty是一个基于JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性.换句话说,Netty是一个NIO框架,使用它可以简单快速 ...
随机推荐
- Java实现第八届蓝桥杯图形排版
标题:图形排版 小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi. 假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版: 1. 该工具会按照 ...
- Java实现 LeetCode 135 分发糖果
135. 分发糖果 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. ...
- Java实现 LeetCode 65 有效数字
65. 有效数字 验证给定的字符串是否可以解释为十进制数字. 例如: "0" => true " 0.1 " => true "abc&q ...
- Java实现第九届蓝桥杯等腰三角形
等腰三角形 题目描述 本题目要求你在控制台输出一个由数字组成的等腰三角形. 具体的步骤是: 1. 先用1,2,3,...的自然数拼一个足够长的串 2. 用这个串填充三角形的三条边.从上方顶点开始,逆时 ...
- RPM包管理-yum在线管理
常用yum命令 查询 查询所有可用软件包列表,yum list 搜索所有和关键字相关的软件包,yum search 关键字 安装 yum -y install 包名,其中,-y 表示自动回答yes 升 ...
- 【福利】FL Studio 20 汉化补丁包 _FL Studio 20 汉化包下载
我这两天在网上搜索FL Studio 20汉化包,找了半天也没有找到真正的汉化包,不过好在功夫不负有心人,让我找到了一个不错的FL Studio 20汉化网站,里面提供了FL Studio 20汉化包 ...
- 第一个SpringMVC程序 (配置版)
通过配置版本的MVC程序,可以了解到MVC的底层原理,实际开发我们用的是注解版的! 1.新建一个普通Maven的项目,然后添加web的支持 2.导入相关的SpringMVC的依赖 3.配置web.xm ...
- [CF1270F]Awesome Substrings
题目 点这里看题目. 分析 设前缀和\(s_r=\sum_{i=1}^r [S_i='1']\) 考虑满足要求的子串\((l,r]\)的要求: \[\exists k\in N_+, r- ...
- c常用函数-strcpy和strncpy
strcpy和strncpy strcpy在脚本开发中经常用到,例如处理参数等,它的作用是把一个字符串复制到另一个字符串中. strncpy的作用是把一个字符串中的指定长度复制到另一个字符串中,如果指 ...
- el-checkbox实现全选与单选
实现目的:实现全选与多选,点击确定的时候获取每个值的id传给后台 1.HTML <el-checkbox v-model="checkAll" @change="h ...