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实现 LeetCode 309 最佳买卖股票时机含冷冻期
309. 最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股 ...
- 第五届蓝桥杯JavaC组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.猜年龄 题目描述 小明带两个妹妹参加元宵灯会.别人问她们多大了,她们调皮地说:"我们俩的年龄之积是年龄之和的6倍" ...
- Java实现最大连续乘积子数组
1 问题描述 给定一个浮点数组,任意取出数组中的若干个连续的数相乘,请找出其中乘积最大的子数组. 2 解决方案 2.1 蛮力法 该方法的时间复杂度为O(n^2). package com.liuzhe ...
- Java实现第八届蓝桥杯青蛙跳杯子
青蛙跳杯子 题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里 ...
- js排他性算法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Spring Cloud 系列之 Alibaba Nacos 注册中心(一)
前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...
- 简单5步,轻松debug K8S服务!
作者: Ram Rai,性能.可扩展性以及软件架构的爱好者 原文链接: https://medium.com/better-programming/debug-your-kubernetes-serv ...
- R调用python模块
明明已经安装了sctransfer,但仍然显示没有该模块 Error in py_module_import(module, convert = convert) : ModuleNotFoundEr ...
- 传递函数-微分方程-差分方程-Matlab阶跃响应曲线
Transfer function: 1 ------- 5 s + 1 写成微分方程: 5y'(t)+y(t)=u(t) 向前差分: 5y(k+1)+(T-5)y(k)=Tu(k) T:Sample ...
- STL sort的comp函数注意事项
今天写了个题,结果碰巧re了,我眉头一皱发现事情并不简单. 原来我之前的comp写的都是错的. bool cmp(milkman a,milkman b) { return a.price<=b ...