用网络编程完成windows和linux跨平台之间的通信(服务器)

news2024/9/9 1:12:08

服务器代码逻辑:

服务器功能

  1. 创建 Socket

    • 服务器首先创建一个 Socket 对象,用于进行网络通信。通常使用 socket() 函数创建。
  2. 绑定(Bind)

    • 服务器将 Socket 绑定到一个特定的 IP 地址和端口号上。这是通过 bind() 函数实现的,目的是告诉操作系统服务器将监听哪个 IP 地址和端口号上的连接请求。
  3. 监听(Listen)

    • 服务器将 Socket 设置为监听模式,准备接受来自客户端的连接请求。这是通过 listen() 函数实现的,通常需要指定一个待处理的连接队列的大小。
  4. 接受连接(Accept)

    • 服务器等待客户端的连接请求。当一个客户端请求连接时,服务器通过 accept() 函数接受连接,并为每个连接创建一个新的 Socket。服务器可以在不同的线程或进程中处理多个客户端连接。
  5. 处理数据(Read/Write)

    • 一旦连接建立,服务器和客户端可以通过已建立的 Socket 进行数据的读写操作。这是通过 recv()send() 函数实现的。
  6. 关闭连接(Close)

    • 当数据传输完成或连接结束时,服务器使用 close() 函数关闭 Socket,释放资源。

windows打开服务器: 

#ifdef _WIN64
#define WIN32
#endif
#ifdef WIN32
#include <Windows.h>
#define socklen_t int
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define  closesocket close
#endif
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<thread>

using namespace std;
class TcpThread
{
public:
	void Main()
	{
		char buf[1024] = { 0 };
		for (;;)
		{
			int recvlen = recv(client, buf, sizeof(buf) - 1, 0);
			//从客户端套接字 client 中接收数据,存储到缓冲区 buf 中。
			//sizeof(buf) - 1 确保缓冲区有足够的空间来存储数据,并保留一个字节用于存储终止符。



			if (recvlen <= 0 || strstr(buf, "quit") != NULL)
			{
				char re[] = "quit success!\n";
				send(client, re, strlen(re) + 1, 0);//发送“quit success!”消息到客户端,然后退出循环。
				break;
			}
			buf[recvlen] = '\0';
			int sendlen = send(client, "ok\n", 4, 0);
			printf("recv %s\n", buf);
		}

		closesocket(client);//关闭客户端套接字,释放相关资源。
		delete this;//删除当前 TcpThread 对象,释放内存。
	}
	int client = 0;
};
int main(int argc, char* argv[])
{
#ifdef WIN32
	/声明一个 WSADATA 结构体变量 ws。WSADATA 是一个结构体,包含了 Windows Sockets 动态链接库(DLL)的详细信息。
	WSADATA ws;
	//WSAStartup 函数初始化 Winsock 库。
	//MAKEWORD(2, 2) 是一个宏,它创建一个 16 位的值,表示我们请求的 Winsock 版本号。在这里,MAKEWORD(2, 2) 表示我们请求 Winsock 2.2 版本。
	//&ws 是指向 WSADATA 结构体的指针,用于接收初始化的信息。
	WSAStartup(MAKEWORD(2, 2), &ws);
#endif




	int sock = socket(AF_INET, SOCK_STREAM, 0);
	//AF_INET表示用的IPV4协议,SOCK_STREAM表示面向连接的稳定数据传输(TCP)
	if (sock == -1)
	{
		printf("create socket failed!\n");
		return -1;
	}
	unsigned short port = 8080;
	if (argc > 1)
	{
		port = atoi(argv[1]);
	}




	//端口号、ip地址
	sockaddr_in saddr;//sockaddr_in 是一个结构体类型,用于存储 IPv4 地址信息。

	saddr.sin_family = AF_INET;//表示IPV4
	saddr.sin_port = htons(port);//转换默认x86小端,host to net 
	saddr.sin_addr.s_addr = htonl(0);//将IP地址设置为 0.0.0.0,表示绑定到所有可用的网络接口。




	//--------------
	if (::bind(sock, (sockaddr*)&saddr, sizeof(saddr)) != 0)
	{
		printf("bind port %d failed!\n", port);
		return -2;
	}
	printf("bind port %d success!\n", port);




	listen(sock, 10);//用于将套接字设为监听模式,使其可以接受传入的连接请求。10表示为套接字排队的最大连接个数




	for (;;)
	{
		sockaddr_in caddr;
		socklen_t len = sizeof(caddr);//socklen_t 是一个数据类型,用于表示套接字相关结构的大小
		int client = accept(sock, (sockaddr*)&caddr, &len);//成功时返回一个新的套接字文件描述符client,用于与已连接的客户端通信。
		if (client <= 0)break;
		printf("accept client %d\n", client);
		char* ip = inet_ntoa(caddr.sin_addr);//将 caddr.sin_addr 中存储的网络字节序的 IP 地址转换为点分十进制的字符串表示形式。
		unsigned short cport = ntohs(caddr.sin_port);//将 caddr.sin_port 中存储的网络字节序的端口号转换为主机字节序
		printf("client ip is %s,port is %d\n", ip, cport);



		TcpThread* th = new TcpThread();
		th->client = client;


		//创建一个新线程,并在该线程中执行 TcpThread 类的 Main 方法
		thread sth(&TcpThread::Main, th);//&TcpThread::Main 是指向 TcpThread 类成员函数 Main 的指针。th 是一个指向 TcpThread 对象的指针。
		sth.detach();
	}
	printf("%d", sock);
	closesocket(sock);
	return 0;
}

windows上直接运行该文件即可打开服务器等待客户端的连接 

linux连接服务器:

 在Putty上输入telnet 192.168.10.4 8080,telnet 192.168.10.4 8080 是一个命令,用于通过 Telnet 协议连接到指定的 IP 地址和端口号。具体来说,它尝试建立一个与 IP 地址 192.168.10.4 上端口 8080 的连接,如果你看到类似于“Connected to 192.168.10.4”这样的消息,说明端口 8080 上的服务正在监听,并且你已成功连接到该服务。这意味着你可以开始发送数据或与该服务交互。

注意  telnet后面的ip是服务器的ip, 

 

当然我们也可以将服务器和客户端都在windows上或linux上打开,我只是为了说明可以跨平台通信而已。 

在linux上编译运行服务器:

先进入该项目的文件夹,我的是test1项目文件夹,cd code, cd test1,在该文件夹下打开vim 编辑一个makefile,输入命令 vim makefile进入编辑页面,

然后输入make test1,即可编译成功,在.\ test1执行即可打开服务器 

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

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

相关文章

51单片机STC89C52RC——16.1 五线四相步进电机

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;步进电机 2.2 什么是步进电机&#xff1f; 2.2.1 步进电机驱动板 静态参数 动态参数 2.2.2 五线四相 单相激励步进 双相激励步进 混合激励驱动 2.3 细分驱动 2.4 通过数字信号控制旋转位置和转速。 2…

JavaScript-map方法

map可以遍历数组处理数据&#xff0c;并返回新的数组 语法&#xff1a; ​const arr[元素1&#xff0c;元素2&#xff0c;元素3] const newarrarr.map(function(数组的元素,数组的索引)){return 新元素 } const arr[blue,red,green]const newarrarr.map(function(ele,index){co…

物业系统自主研发接口测试框架

1、自主研发框架整体设计 1.1、什么是测试框架? 在了解什么是自动化测试框架之前&#xff0c;先了解一下什么叫框架?框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架…

【小白也能看的懂】想要玩转AI大模型,这4招你得知道

前言 对于大部分人来说&#xff0c;能够灵活使用AI工具&#xff0c;并对自己每个常用的AI工具优劣势很清楚&#xff0c;就已经足够了。不过&#xff0c;毕竟AI发展实在太快&#xff0c;多了解一些相关的知识点&#xff0c;以全局的视角去看AI&#xff0c;可以避免管中窥豹&…

用SmartEDA点亮电路教学:传统课堂的革新之道

在数字化浪潮的推动下&#xff0c;教育领域也迎来了前所未有的变革。特别是在电路教学这一专业领域&#xff0c;传统的黑板加课本的教学模式已难以满足现代学生的需求。今天&#xff0c;我们就来探讨一下&#xff0c;如何利用SmartEDA电路仿真软件来补充传统教学&#xff0c;为…

Oracle 23ai 中的重要新特性 VECTOR 数据类型

Oracle 23ai 中的 VECTOR 数据类型是 Oracle 数据库在 AI 领域的一个重要新特性&#xff0c;它允许用户以向量的形式存储数据&#xff0c;并在这些向量的基础上进行高效的搜索和分析。以下是对 Oracle 23ai VECTOR 数据类型的详细解析&#xff1a; 参考官方文档地址 https://d…

Python机器学习推理工程化落地步骤指南

目录 一、引言 二、数据准备 2.1 数据收集 2.2 数据清洗 2.3 特征工程 2.4 数据分割 三、模型训练 3.1 选择算法 3.2 训练模型 3.3 模型评估 3.4 模型调优 四、模型部署 4.1 模型序列化 4.2 构建推理服务 4.3 部署与监控 五、总结 在当今科技飞速发展的时代…

【SVN的使用-通过xCode使用SVN-SVN的目录结构 Objective-C语言】

一、接下来,我们来通过xcode使用SVN啊 1.我先把小明这个目录下,wechat这个文件夹都删了, 我现在小明新入职了,但是呢,我现在不喜欢用命令行,我也不喜欢用Corner Stone,我要用xcode, 作为小明,我入职以后,第一件事儿,要把代码checkout下来, 那首先呢,打开你的xc…

从3D扫描到CAD模型【逆向工程】

有时&#xff0c;你无法访问零件原始生产中的原始设计文档。逆向工程&#xff08;reverse engineering&#xff09;使你能够分析物理零件并探索其最初的制造方式&#xff0c;以复制、创建变体或改进设计。目标是最终创建一个用于制造的新 CAD 模型。 虽然逆向工程的概念非常简…

Linux--安装VMware步骤

安装VMware VMware Desktop Hypervisors for Windows, Linux, and Mac 复制链接打开浏览器下载即可 从官网下载软件&#xff0c;完成后为确保后续正常使用&#xff0c;需要检查虚拟网卡是否安装完成 检查虚拟网卡的安装步骤 Windows--设置--高级设置--网络适配器--看是否有显…

录屏软件免费推荐,拥有这4款,不花一分钱

在这个充满创意与活力的数字时代&#xff0c;录屏软件早已成为我们探索世界、分享生活的必备神器。但市面上却存在很多收费的录屏软件&#xff0c;让人望而却步。那么有没有一些录屏软件免费帮助我们轻松开启录影人生&#xff0c;尽情展现创意与才华呢&#xff1f; 本文就将带…

【错题集-编程题】kotori 和 n 皇后(哈希表)

牛客对应题目链接&#xff1a;kotori和n皇后 (nowcoder.com) 一、分析题目 算法思路&#xff1a;使用哈希表标记行列以及两个对角线。 注意&#xff1a;输出的时候提前判断⼀下。 二、代码 //值得学习的代码 #include <iostream> #include <unordered_set>using n…

旷野之间14 - 常见的AI面试题解答

​​​​​ 1. 什么是大型语言模型(LLM)以及它如何工作? 大型语言模型 (LLM),例如 GPT-3 或 BERT,是具有理解和生成类似人类的文本能力的高级机器学习模型。 核心组件和操作: 编码器-解码器框架:用于 GPT-3(单向)和 BERT(双向)等模型。Transformer 架构:利用具有…

N-(4-Azido-2-nitrophenyl)-N‘‘-biotinylnorspemidine

​一、基本信息 常用名&#xff1a;N-(4-Azido-2-nitrophenyl)-N-biotinylnorspemidine 英文名&#xff1a;N-(4-Azido-2-nitrophenyl)-N-biotinylnorspemidine CAS号&#xff1a;786609-83-4 分子式&#xff1a;C22H33N9O4S 分子量&#xff1a;519.62 二、结构特点 该化…

【深海王国】小学生都能玩的语音模块?ASRPRO打造你的第一个智能语音助手(9)

Hi~ (o^^o)♪, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督继续为大家带来系列——小学生都能玩的语音模块&#xff0c;帮你一周内快速学会语音模块的使用方式&#xff0c;打造一个可用于智能家居、物联网领域的语音助…

如何下载git上的代码到本地

第一步&#xff1a;第一步&#xff1a;进入所在项目&#xff0c;右击打开"Git Bash Here" 第二步&#xff1a;git clone https://gitee.com/xxx/xxxx #文件地址链接 完结&#xff1a;

TCP协议双向网络通讯---Python实现

本篇文章是博主在人工智能、网络通讯等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在Python…

基于uni-app与图鸟UI的知识付费小程序模板

一、项目概述 在知识经济蓬勃发展的背景下&#xff0c;移动互联网成为知识传播与消费的重要渠道。本项目旨在利用前沿的前端技术栈——uni-app及高效UI框架图鸟UI&#xff0c;打造一款集多功能于一体的、面向广大求知者的知识付费平台移动端模板。该模板旨在简化开发流程&…

《大明混一图》: 令人叹为观止的古代世界地图

关注我们 - 数字罗塞塔计划 - 《大明混一图》是我国目前保存尺寸最大、最完整、年代最久远&#xff0c;且由中国人自己绘制的世界地图&#xff0c;2003年10月被列入《中国档案文献遗产名录》&#xff0c;现保存于中国第一历史档案馆。据学者们研究&#xff0c;这幅地图大约是…

【SD教程】全网最详细的AI绘画提示词语法讲解!(附提示词插件包)

AI绘画提示词如何写&#xff1f;对于入门的小伙伴来说这是一个大问题&#xff0c;提示词写的好&#xff0c;才能有高质量的作品&#xff0c;那今天给大家详细讲解一下&#xff0c;建议点赞收藏&#xff01; 文末附提示词插件 一、SD提示词基础 AI绘画提示词基本规则 1、提示…