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

服务器代码逻辑:

服务器功能

  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);
#endifint 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;//表示IPV4saddr.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.mzph.cn/news/867683.shtml

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

相关文章

昇思25天学习打卡营第19天 | RNN实现情感分类

RNN实现情感分类 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This fil…

PyTorch实现InceptionResNetV2:预训练模型适应多类别任务代码解析

系列文章目录 9种经典图片分类卷积模型系列合集&#xff08;推荐程度依次递减&#xff09;&#xff1a; Se_resnet50Resnet50Xceptioninceptionresnetv2resnextbninceptionshufflenetv2polynetvggm Imagenet的预训练inceptionresnetv2是1000个类别&#xff0c;根据笔者添加了…

Go 中的类型推断

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

【三级等保】等保整体建设方案(Word原件)

建设要点目录&#xff1a; 1、系统定级与安全域 2、实施方案设计 3、安全防护体系建设规划 软件全文档&#xff0c;全方案获取方式&#xff1a;本文末个人名片直接获取。

【Python】基于KMeans的航空公司客户数据聚类分析

&#x1f490;大家好&#xff01;我是码银~&#xff0c;欢迎关注&#x1f490;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 实验目的和要求 会用Python创建Kmeans聚类分析模型使用KMeans模型对航空公司客户价值进行聚类分析会对聚类结果进行分析评价 实…

Python酷库之旅-第三方库Pandas(008)

目录 一、用法精讲 16、pandas.DataFrame.to_json函数 16-1、语法 16-2、参数 16-3、功能 16-4、返回值 16-5、说明 16-6、用法 16-6-1、数据准备 16-6-2、代码示例 16-6-3、结果输出 17、pandas.read_html函数 17-1、语法 17-2、参数 17-3、功能 17-4、返回值…

CountDownLatch简介

引言 在多线程编程中&#xff0c;线程之间的协调和同步是一个常见的需求。Java 提供了多种工具来实现这一目标&#xff0c;其中 CountDownLatch 是一种简单而强大的同步机制。本文将详细介绍 CountDownLatch 的概念、使用方法和实际应用场景。 1. CountDownLatch 概述 Count…

Redis新手教程

Redis新手教程 目录 什么是RedisRedis的安装 安装前准备安装步骤 Redis的基本数据类型 字符串哈希列表集合有序集合 Redis的持久化 快照AOF Redis的高可用性 主从复制Redis SentinelRedis Cluster Redis的使用场景Redis的优缺点总结 1. 什么是Redis Redis&#xff08;Remot…

IPython 调试秘籍:精通 %xmode 命令的错误显示模式设置

IPython 调试秘籍&#xff1a;精通 %xmode 命令的错误显示模式设置 在使用 IPython 进行交互式编程时&#xff0c;错误信息的显示模式对于调试代码至关重要。%xmode 命令是 IPython 中专门用于控制错误信息展示方式的魔术命令。本文将详细解释 %xmode 命令的使用方法&#xff…

介绍东芝TB62262FTAG芯片:高性能两相双极步进电机驱动器

在当今快速发展的科技领域&#xff0c;高性能的电机驱动器对于许多工程项目来说至关重要。东芝的TB62262FTAG这款两相双极步进电机驱动器采用PWM斩波技术&#xff0c;集成了多个先进功能&#xff0c;适用于各种工业和消费类应用。本文将详细介绍TB62262FTAG的参数、性能、优势及…

ubuntu22 设置开机直接登录桌面

专栏总目录 一、打开设置文件 sudo vi /etc/gdm3/custom.conf 二、修改设置 在[daemon] 找到AutomaticLoginEnable和AutomaticLogin选项&#xff0c;取消注释并修改为&#xff1a; [daemon] # 自动登录用户名 AutomaticLoginEnableTrue AutomaticLoginusername 其中usernam…

《向量数据库指南》——Milvus Cloud检索器增强的深度探讨:句子窗口检索与元数据过滤

检索器增强的深度探讨&#xff1a;句子窗口检索与元数据过滤 在信息爆炸的时代&#xff0c;高效的检索系统成为了连接用户与海量数据的关键桥梁。为了进一步提升检索的准确性和用户满意度&#xff0c;检索器增强技术应运而生&#xff0c;其中句子窗口检索与元数据过滤作为两大…

【Qt】day3 自定义控件、框架、定时器、QPainter、QFile

文章目录 自定义控件封装自定义框架定时器第一种方式第二种方式 &#xff08;推荐&#xff09; 事件分发器QPainter基本操作高级设置抗锯齿移动坐标原点 画家画资源图片&#xff0c;并实现手动移动 作业QPaintDevice绘图设备QPixmapQimageQPicture QFile文件读写操作QFileInfo文…

移动校园(3):处理全校课程数据excel文档,实现空闲教室查询与课程表查询

首先打开教学平台 然后导出为excel文档 import mathimport pandas as pd import pymssql serverName 127.0.0.1 userName sa passWord 123456 databaseuniSchool conn pymssql.connect(serverserverName,useruserName,passwordpassWord,databasedatabase) cursor conn.cur…

Python面试题:在 Python 中,如何实现上下文管理器(context manager)?

在 Python 中&#xff0c;实现上下文管理器&#xff08;context manager&#xff09;有两种常见的方法&#xff1a;使用类和使用装饰器&#xff08;contextlib 模块中的 contextmanager 装饰器&#xff09;。上下文管理器用于管理资源&#xff0c;例如文件、网络连接等&#xf…

昇思11天

基于 MindSpore 实现 BERT 对话情绪识别 BERT模型概述 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google于2018年开发并发布的一种新型语言模型。BERT在许多自然语言处理&#xff08;NLP&#xff09;任务中发挥着重要作用&am…

【C++】map和set详解

目录 1. 关联式容器 2. 键值对pair 3. 树形结构的关联式容器 4. set 4.1 set的介绍 4.2 set的构造 4.3 set的迭代器 4.4 set的容量 4.5 set的常用函数 5. multiset 6. map 6.1 map的介绍 6.2 map的构造 6.3 map的迭代器 6.4 map的容量 6.5 map的operator[] 6.6…

BiLSTM模型实现

# 本段代码构建类BiLSTM, 完成初始化和网络结构的搭建 # 总共3层: 词嵌入层, 双向LSTM层, 全连接线性层 # 本段代码构建类BiLSTM, 完成初始化和网络结构的搭建 # 总共3层: 词嵌入层, 双向LSTM层, 全连接线性层 import torch import torch.nn as nn# 本函数实现将中文文本映射为…

Android使用HttpURLConnection实现文件上传(包括图片)

1.文件上传完整代码 下面是完整的文件上传代码&#xff0c;复制即可使用。注意要开启子线程运行 public class UploadFileTask {/*** 上传文件到服务器&#xff0c;并返回服务器相应结果* param requestURL 服务器的地址* param imageUri 文件的Uri* param context* return 服…

【虚幻引擎】UE4初学者系列教程开发进阶实战篇——生存游戏案例

一、课程体系 1 学前必读 2 Character类相关基础 -人物移动控制 -动画蓝图 3 常见游戏机制基础 -碰撞器、触发器 -物体使用接口 -视角切换 4其他相关设计 -背包系统 -锻造系统 -物体破碎效果 -简易种植系统 -互动物体动画 5课程结语 二、UI部分 思维导图部分 实操部分 …