【网络】windows和linux互通收发

windows和linux互通收发

  • 一、windows的udp客户端代码
    • 1、代码剖析
    • 2、总体代码
  • 二、linux服务器代码
  • 三、成果展示


一、windows的udp客户端代码

1、代码剖析

首先我们需要包含头文件以及lib的一个库:

#include <iostream>
#include <WinSock2.h>
#include <string>
#pragma comment(lib,"ws2_32.lib")

然后我们需要启动windows的套接字,并且对winsocket进行初始化:

int main()
{WSAData wsd;//启动Winsock//进行Winsocket的初始化,windows初始化socket网络库,申请2.2的版本if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0){cout << "WSAStartup Error =" << WSAGetLastError() << endl;return 0;}else{cout << "WSAStartup Success" << endl;}
}

startup就是启动的接口,里面的参数的意思是:初始化socket网络库,申请2.2的版本。如果startup这个函数的返回值等于0就说明启动成功,否则就启动失败我们就打印一下。

以上是不同的方面,下面是用的linux一套:
在这里插入图片描述

创建套接字:

	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock == SOCKET_ERROR){cout << "socket ERROR = " << WSAGetLastError() << endl;return 1;}else{cout << "socket success" << endl;}

客户端收发消息:

	struct sockaddr_in server;memset(&server, 0, sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(serverport);server.sin_addr.s_addr = inet_addr(serverip.c_str());string line;while (true){cout << "Please Enter# ";getline(cin, line);int n = sendto(sock, line.c_str(), line.size(), 0, (struct sockaddr*)&server, sizeof(server));if (n < 0){cerr << "sendto error" << endl;break;}//接收服务器的数据char buffer[1024];struct sockaddr_in client;int len = sizeof(client);n = recvfrom(sock, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&client, &len);if (n >= 0){buffer[n] = 0;}cout << "[server echo]: " << buffer << endl;}

关闭套接字和网络服务:

	closesocket(sock);WSACleanup();

这里会出现这个问题,有两种解决方法:
在这里插入图片描述
第一种解决方法是:#define _WINSOCK_DEPRECATED_NO_WARNINGS 1
第二种解决方法是:#pragma warning(disable:4996)这个仅仅是屏蔽了这某一个错误

2、总体代码

#define _WINSOCK_DEPRECATED_NO_WARNINGS  1
#include <iostream>
#include <WinSock2.h>
#include <string>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
uint16_t serverport = ; // 这里用随便的端口号
std::string serverip = ; // 这里用自己的云服务器的ip
int main()
{WSAData wsd;// 启动Winsock// 进行Winsocket的初始化,windows初始化socket网络库,申请2.2的版本if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0){cout << "WSAStartup Error =" << WSAGetLastError() << endl;return 0;}else{cout << "WSAStartup Success" << endl;}SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock == SOCKET_ERROR){cout << "socket ERROR = " << WSAGetLastError() << endl;return 1;}else{cout << "socket success" << endl;}struct sockaddr_in server;memset(&server, 0, sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(serverport);server.sin_addr.s_addr = inet_addr(serverip.c_str());string line;while (true){cout << "Please Enter# ";getline(cin, line);int n = sendto(sock, line.c_str(), line.size(), 0, (struct sockaddr*)&server, sizeof(server));if (n < 0){cerr << "sendto error" << endl;break;}//接收服务器的数据char buffer[1024];struct sockaddr_in client;int len = sizeof(client);n = recvfrom(sock, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&client, &len);if (n >= 0){buffer[n] = 0;}cout << "[server echo]: " << buffer << endl;}closesocket(sock);WSACleanup();return 0;
}

二、linux服务器代码

main.cc

#include "udp.hpp"
#include "Log.hpp"
#include <memory>
#include <cstdio>
#include <vector>Log log;void Usage(std::string proc)
{std::cout << "\n\rUsages: " << proc << "port[1024+]\n" << std::endl;
}std::string Handler(const std::string& str)
{std::string res = "recv a message# ";res += str;std::cout << res << std::endl;return res;
}bool SafeCheck(const std::string& cmd)
{std::vector<std::string> word_key = {"rm","top","cp","yum","while","kill","unlink""uninstall","top"};for (auto &word : word_key){auto pos = cmd.find(word);if (pos != std::string::npos){return false;}}return true;
}std::string ExcuteCommand(const std::string& cmd)
{std::cout << "get a massage:" << cmd << std::endl;// 做一个保护if (!SafeCheck(cmd)) return "bad man";FILE* fp = popen(cmd.c_str(), "r"); // 管道创建好,子进程创建好,子进程通过管道放到父进程if (nullptr == fp){perror("popen failed");return "error";}std::string result;char buffer[4096];while (true){char* ok = fgets(buffer, sizeof(buffer), fp); // 写到buffer缓冲区中if (ok == nullptr){break;}result += buffer;}pclose(fp);return result;
}// 以后用的是./udpserver + port
int main(int argc, char *argv[])
{if (argc != 2){Usage(argv[0]);exit(0);}uint16_t port = std::stoi(argv[1]);std::unique_ptr<UdpServer> svr(new UdpServer(port)); // new一个对象svr->Init(); // 初始化svr->Run(ExcuteCommand);  // 跑起来
}

udp.hpp:

#pragma once #include <iostream>
#include <string>
#include <cstring>
#include <functional>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "Log.hpp"using func_t = std::function<std::string(const std::string&)>; // 将返回值为string,参数为const string&的函数包装起来extern Log log;uint16_t defaultport = 8080;
std::string defaultip = "0.0.0.0";enum 
{SOCKET_ERR=1,BIND_ERR
};class UdpServer
{
public:// 构造函数UdpServer(const uint16_t &port = defaultport, const std::string &ip = defaultip): _socketfd(0), _port(port), _ip(ip), _isrunning(false){}void Init(){// 1.创建udp套接字socket_socketfd = socket(AF_INET, SOCK_DGRAM, 0);// 创建失败if (_socketfd < 0){log(Fatal, "socket create error,socketfd:%d", _socketfd);exit(SOCKET_ERR);}// 创建成功log(Info, "socket create sucess,socketfd:%d", _socketfd);// 2.绑定端口号bind socketstruct sockaddr_in local; // 网络套接字结构体bzero(&local, sizeof(local)); // 将该套接字结构体对象全部清零local.sin_family = AF_INET; // 类型:ipv4local.sin_port = htons(_port); // 端口号:是在网络中来回发送的,我发过去要让对面知道我发的端口号是什么,所以必须是网络字节序列local.sin_addr.s_addr = inet_addr(_ip.c_str()); // 1.string->unit_32 2.来回通信对方要知道发送的ip,所以ip的unit_32必须是网络序列的int n = bind(_socketfd, (const struct sockaddr *)&local, sizeof(local));if (n < 0){log(Fatal, "bind error, erron:%d, errno string:%s", errno, strerror(errno));exit(BIND_ERR);}log(Info, "bind sucess");}void Run(func_t func) // 对代码进行分层{_isrunning = true;char inbuffer[1024];while (_isrunning){struct sockaddr_in client;socklen_t len = sizeof(client);ssize_t n = recvfrom(_socketfd, inbuffer, sizeof(inbuffer) - 1, 0, (struct sockaddr*)&client, &len);if (n < 0){log(Warning, "recvfrom error");continue;}// 简单的数据处理一下inbuffer[n] = 0;std::string info = inbuffer;std::string echo_string = func(info); // 回调函数,将处理的结果用外部回调函数去处理一下// 回调函数也叫钩子函数,相当于一个钩子等待鱼儿上钩,到这个回调函数info传进参数也就是有鱼上钩的// 时候就进行传参并进行外部处理,我们只需要在main.cc文件中封装一个函数进行处理这个拼接的函数即可sendto(_socketfd, echo_string.c_str(), echo_string.size(), 0, (const struct sockaddr*)&client, len);}}// 析构函数~UdpServer(){if (_socketfd > 0) {close(_socketfd);}}
private:int _socketfd; // 网络文件描述符,表示socket返回的文件描述符uint16_t _port; // 表明服务器进程的端口号std::string _ip; // ip地址,任意地址绑定为0bool _isrunning; // 判断是否运行
};

三、成果展示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【模板代码】用于编写Threejs Demo的模板代码

基础模板代码 使用须知常规模板代码常规Shader模板代码 使用须知 本模板代码&#xff0c;主要用于编写Threejs的Demo&#xff0c;因为本人在早期学习的过程中&#xff0c;大量抄写Threejs/examples下的代码以及各个demo站的代码&#xff0c;所以养成了编写Threejs的demo的习惯…

SAP 采购订单 Adobe 消息输出

目录 1 简介 2 业务数据例子 3 选择增强 & 代码 1&#xff09;BADI: MM_PUR_S4_PO_MODIFY_HEADER 2&#xff09;BADI: MM_PUR_S4_PO_MODIFY_ITEM 4 自定义 Adobe form 1&#xff09;PO Master form 2&#xff09;PO form 5 前台主数据配置 6 后台配置 1&#xf…

掌握Rust:函数、闭包与迭代器的综合运用

掌握Rust&#xff1a;函数、闭包与迭代器的综合运用 引言&#xff1a;解锁 Rust 高效编程的钥匙函数定义与模式匹配&#xff1a;构建逻辑的基石高阶函数与闭包&#xff1a;代码复用的艺术迭代器与 for 循环&#xff1a;高效数据处理的引擎综合应用案例&#xff1a;构建一个简易…

【LeetCode】day15:110 - 平衡二叉树, 257 - 二叉树的所有路径, 404 - 左叶子之和, 222 - 完全二叉树的节点个数

LeetCode 代码随想录跟练 Day15 110.平衡二叉树257.二叉树的所有路径404.左叶子之和222.完全二叉树的节点个数 110.平衡二叉树 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 平衡二叉树的定义是&#xff0c;对于树中的每个节点&#xff0c;其左右…

qt自定义控件(QLabel)

先创建自定义控件类painter_label 1.自定义类必须给基类传入父窗口指针 2.重写控件中的方法 3.在UI中创建一个QLabel,右键“提升为”&#xff0c;输入类名

动画革命:Lottie如何改变我们对移动应用交互的认知

在数字世界的浩瀚星空中&#xff0c;每一个像素都跃动着无限创意与想象的火花。当静态的界面遇上动态的魔法&#xff0c;一场视觉盛宴便悄然开启。今天&#xff0c;让我们一同揭开一位幕后英雄的神秘面纱——Lottie&#xff0c;这个在UI/UX设计界掀起波澜的动画利器&#xff0c…

SVN与Git功能差异对比分析

最近在调研学习Git管理和分支模型相关内容&#xff0c;外延到了SVN和Git差异、工作原理等相关细节&#xff0c;学习整理如下。 SVN&#xff08;Subversion&#xff09;与 Git 的最大不同&#xff0c;主要包括以下几个方面&#xff1a; 交流探讨&#xff0c;加入群聊【Java学习…

51.2T 800G 以太网交换机,赋能AI开放生态

IB与以太之争 以太网替代IB趋势明显。据相关报告&#xff1a;2024年TOP500的超算中&#xff0c;采用以太网方案占比48.5%&#xff0c;InfiniBand占比为39.2%&#xff0c;其中排名前6的超算中已有5个使用以太网互联。 开放系统战胜封闭系统仅是时间问题。我们已经看到&#xf…

钡铼EdgeIO系统BL206对接MQTT、Modbus TCP、OPC UA

钡铼EdgeIO系统BL206提供双网口支持交换机级联功能&#xff0c;支持标准MQTT协议、Modbus TCP协议、OPC UA协议&#xff0c;由耦合器与IO模块组成&#xff0c;采用Web配置&#xff0c;内置云驱动、可编程逻辑控制功能&#xff0c;用户点击即可连接云平台。耦合器自带诊断功能&a…

网络结构-组件-AI(九)

深度学习网络组件 RNN公式讲解计算示意图讲解 CNN计算示意 Normalization(归一化层)Normalization常见两种方式 Dropout层 RNN 循环神经网络&#xff08;recurrent neural network&#xff09; 主要思想&#xff1a; 即将整个序列划分成多个时间步&#xff0c;将每一个时间步的…

GPU OpenGL 版本检测 GLview

官网链接 https://www.geeks3d.com/dl/show/10097 也可在此下载https://download.csdn.net/download/qq_51355375/89559913 下载后直接默认安装即可&#xff0c; 打开安装目录&#xff0c;双击运行openglex.exe即可

【Python系列】Python 缓存机制

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【一刷《剑指Offer》】面试题 49(案例):把字符串转换成整数

力扣对应题目链接&#xff1a;8. 字符串转换整数 (atoi) - 力扣&#xff08;LeetCode&#xff09; 一、《剑指Offer》对应内容 二、分析题目 根据题意&#xff0c;有以下四种字符需要考虑&#xff1a; 首部空格&#xff1a; 删除之即可。符号位&#xff1a; 三种情况&#xf…

计算机网络知识点面试总结3

#来自ウルトラマンゼロ&#xff08;赛罗&#xff09; 1 数据链路层功能 数据链路层在物理层提供的服务的基础上向网络层提供服务&#xff0c;其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层&#xff0c;其主要作用是加强物理层传输原始比特流的功能。…

【Day12】登录认证、异常处理

1 登录 先创建一个新的 controller 层&#xff1a;LoginController RestController public class LoginController {Autowiredprivate EmpService empService;// 注入PostMapping("/login")public Result login(RequestBody Emp emp) { // 包装对象Emp e empServic…

PyTorch的自动微分模块【含梯度基本数学原理详解】

文章目录 1、简介1.1、基本概念1.2、基本原理1.2.1、自动微分1.2.2、梯度1.2.3、梯度求导1.2.4、梯度下降法1.2.5、张量梯度举例 1.3、Autograd的高级功能 2、梯度基本计算2.1、单标量梯度2.2、单向量梯度的计算2.3、多标量梯度计算2.4、多向量梯度计算 3、控制梯度计算4、累计…

系统架构设计师教程(清华第二版) 第3章 信息系统基础知识-3.3 管理信息系统(MIS)-解读

系统架构设计师教程 第3章 信息系统基础知识-3.3 管理信息系统(MIS) 3.3.1 管理信息系统的概念3.3.1.1 部件组成3.3.1.2 结构分类3.3.1.2.1 开环结构3.3.1.2.2 闭环结构3.3.1.3 金字塔结构3.3.2 管理信息系统的功能3.3.3 管理信息系统的组成3.3.3.1 销售市场子系统3.3.3.2…

x86+FPGA+AI:地铁全线刷脸过闸,地铁智慧票务系统专用计算机

地铁全线刷脸过闸 | 可提供地铁智慧票务系统专用计算机 近日&#xff0c;成都地铁在全线网地铁车站正式上线“智慧票务”系统&#xff0c;全通道无接触式“戴口罩刷脸乘车”的通行方式优化了乘客出行效率、降低了疫情交叉感染风险&#xff0c;因此备受好评&#xff01; 01、地铁…

Unity UGUI 之 Image和Rawimage

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.Image是什么 Unity - 手册&#xff1a;图像 精灵格式是什么&#xff1f; 1.2重要参数 …

Linux的热插拔UDEV机制和守护进程

目录 一、Linux的热插拔UDEV机制 二、守护进程 2.1 守护进程概念和基本特点&#xff1a; 2.2 显示进程信息&#xff1a; 2.3 守护进程和后台进程的区别&#xff1a; 2.4 创建守护进程的步骤和守护进程的特征&#xff1a; 2.4.1 创建守护进程的步骤&#xff1a; 2.4.2 守…