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 123 买卖股票的最佳时机 III(三)
123. 买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与 ...
- java实现 洛谷 P1018 乘积最大
import java.math.BigInteger; import java.util.Scanner; public class Main { private static Scanner ci ...
- Java实现判断单联通(强连通缩点+拓扑排序)Going from u to v or from v to u
Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has ...
- java实现第二届蓝桥杯最小公倍数(c++)
最小公倍数. 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致. 但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多. 事实上,它是1至6的每个数字的倍数.即1,2,3,4,5,6 ...
- java实现第六届蓝桥杯隔行变色
隔行变色 隔行变色 Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式. 小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,- 现在小明想知道,从第21行 ...
- set基本运用
/* set集合基本用法 */ #include<iostream> #include<set> using namespace std; //set<T>a; v ...
- iOS-自定义 UITabBarController
先来回顾一下UITabBarController ( 稍微详细的在在http://blog.csdn.net/yang198907/article/details/49807011) 伴随UITabB ...
- struts 通配符的使用
使用通配符可以将配置量降到最低,十分方便 新建一个javaweb项目 在项目中加入Struts.xml( 选中项目右键MyEclipse-->project facets-->Struts ...
- 5、react-路由
1.单页面:(只有一个index.html)(为什么要使用react-router再react中) 所有的组件都是再同一个index.html中进行显示的,它再显示的时候是怎么显示的,通过你点击的连接 ...
- 大话微服务(Big Talk in MicroService)
下面开始分析我的microservice 之旅. what? 是什么 why? 为什么 how? 什么做 1.什么是微服务 microservice 是 SOA(Service-Oriented Ar ...