当前位置: 首页 > news >正文

tcp发送整型,结构体等数据的方法

测试环境

  1. Receiver: x86 Ubuntu
  2. Sender: arm64 android

发送整型数

C语言和套接字库来发送一个整型变量(int)的客户端程序。

  1. 它首先创建一个TCP套接字,然后连接到指定的服务器地址和端口。
  2. 接着,它将一个整型变量(int)转换为网络字节序(大端),
  3. 并使用send()函数发送给服务器。最后,它关闭套接字并退出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>#define SERVER_IP "127.0.0.1" // 服务器IP地址
#define SERVER_PORT 8888 // 服务器端口号int main(int argc, char* argv[])
{const char *ip = SERVER_IP;if(argc == 2){ip = argv[1];        }fprintf(stdout, "ip:%s\n", ip);int sock; // 套接字描述符struct sockaddr_in server; // 服务器地址结构体int data = 1234; // 要发送的整型数据int n; // 发送或接收的字节数// 创建一个TCP套接字sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){perror("socket failed");exit(1);}// 设置服务器地址结构体memset(&server, 0, sizeof(server));server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(ip);server.sin_port = htons(SERVER_PORT);// 连接到服务器if (connect(sock, (struct sockaddr *)&server, sizeof(server)) == -1){perror("connect failed");exit(2);}#if 0// 将整型数据转换为网络字节序(大端)data = htonl(data);// 发送整型数据给服务器n = send(sock, &data, sizeof(data), 0);if (n == -1){perror("send failed");exit(3);}
#elseunsigned char sendbuf[4];sendbuf[0] = data & 0xff;sendbuf[1] = (data >> 8) & 0xff;sendbuf[2] = (data >> 16) & 0xff;sendbuf[3] = (data >> 24) & 0xff;// 发送整型数据给服务器n = send(sock, sendbuf, sizeof(sendbuf), 0);if (n == -1){perror("send failed");exit(3);}
#endif printf("Sent %d bytes to server\n", n);// 关闭套接字close(sock);return 0;
}

这是一个使用C语言和套接字库来接收一个整型变量(int)的服务器程序。

  1. 它首先创建一个TCP套接字,然后绑定到指定的地址和端口。
  2. 接着,它监听客户端的连接请求,并接受一个连接。
  3. 然后,它使用recv()函数接收客户端发送的整型数据,并将其转换为主机字节序(小端或大端)。
  4. 最后,它打印出接收到的数据,并关闭套接字。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>#define SERVER_IP "0.0.0.0" // 服务器IP地址
#define SERVER_PORT 8888 // 服务器端口号int main(int argc, char* argv[])
{int sock, client_sock; // 套接字描述符struct sockaddr_in server, client; // 服务器和客户端地址结构体int data; // 要接收的整型数据int n; // 发送或接收的字节数int len; // 客户端地址长度// 创建一个TCP套接字sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){perror("socket failed");exit(1);}// 设置服务器地址结构体memset(&server, 0, sizeof(server));server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(SERVER_IP);server.sin_port = htons(SERVER_PORT);// 绑定套接字到指定的地址和端口if (bind(sock, (struct sockaddr *)&server, sizeof(server)) == -1){perror("bind failed");exit(2);}// 监听客户端的连接请求,设置最大连接数为5if (listen(sock, 5) == -1){perror("listen failed");exit(3);}printf("Waiting for client connection...\n");// 接受一个客户端的连接,返回一个新的套接字描述符len = sizeof(client);client_sock = accept(sock, (struct sockaddr *)&client, (socklen_t*)&len);if (client_sock == -1){perror("accept failed");exit(4);}printf("Connected to client: %s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
#if 0// 接收客户端发送的整型数据n = recv(client_sock, &data, sizeof(data), 0);if (n == -1){perror("recv failed");exit(5);}printf("Received %d bytes from client\n", n);// 将整型数据转换为主机字节序(小端或大端)data = ntohl(data);
#else// 接收客户端发送的整型数据unsigned char recvbuf[4];n = recv(client_sock, recvbuf, sizeof(recvbuf), 0);if (n == -1){perror("recv failed");exit(5);}printf("Received %d bytes from client\n", n);data = (recvbuf[0] & 0xff) | (recvbuf[1] << 8) & 0xff00 | (recvbuf[2]<< 16)&0xff0000 | (recvbuf[3] << 24)&0xff000000;
#endif// 打印出接收到的数据printf("Data: %d\n", data);// 关闭套接字close(client_sock);close(sock);return 0;
}

发送并接受结构体

发送端

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <sys/socket.h>  
#include <arpa/inet.h>  
#include <unistd.h>  #define SERVER_IP "127.0.0.1"// 定义结构体  
struct Data {  int id;  char name[20];  
};  int main(int argc, char* argv[]) {const char* ip = SERVER_IP;if(argc == 2){ip = argv[1];}fprintf(stdout, "ip:%s\n", ip);int sockfd;  struct sockaddr_in server_addr;  struct Data data = { 1, "John" };  // 创建套接字  sockfd = socket(AF_INET, SOCK_STREAM, 0);  if (sockfd < 0) {  perror("socket error");  exit(EXIT_FAILURE);  }  // 设置服务器地址信息  memset(&server_addr, 0, sizeof(server_addr));  server_addr.sin_family = AF_INET;  server_addr.sin_addr.s_addr = inet_addr(ip); // 修改为服务器地址  server_addr.sin_port = htons(8888); // 修改为服务器端口号  // 连接服务器  if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {  perror("connect error");  exit(EXIT_FAILURE);  }  // 发送结构体数据  if (send(sockfd, &data, sizeof(data), 0) < 0) {  perror("send error");  exit(EXIT_FAILURE);  }  printf("Data sent successfully\n");  // 关闭套接字  close(sockfd);  return 0;  
}

接收端

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <sys/socket.h>  
#include <arpa/inet.h>  
#include <unistd.h>  // 定义结构体  
struct Data {  int id;  char name[20];  
};  int main() {  int sockfd;  struct sockaddr_in server_addr, client_addr;  struct Data data;  socklen_t client_len = sizeof(client_addr);  // 创建套接字  sockfd = socket(AF_INET, SOCK_STREAM, 0);  if (sockfd < 0) {  perror("socket error");  exit(EXIT_FAILURE);  }  // 设置服务器地址信息  memset(&server_addr, 0, sizeof(server_addr));  server_addr.sin_family = AF_INET;  server_addr.sin_addr.s_addr = INADDR_ANY;  server_addr.sin_port = htons(8888);  // 绑定套接字到服务器地址  if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {  perror("bind error");  exit(EXIT_FAILURE);  }  // 监听连接  if (listen(sockfd, 5) < 0) {  perror("listen error");  exit(EXIT_FAILURE);  }  printf("Waiting for a connection...\n");  // 接受客户端连接  int connfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);  if (connfd < 0) {  perror("accept error");  exit(EXIT_FAILURE);  }  printf("Connection accepted from %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));  // 接收结构体数据  if (recv(connfd, &data, sizeof(data), 0) < 0) {  perror("recv error");  exit(EXIT_FAILURE);  }  printf("Received data: id = %d, name = %s\n", data.id, data.name);  // 关闭套接字和连接  close(connfd);  close(sockfd);  return 0;  
}

介绍四个函数

uint32_t htonl(uint32_t hostlong); // 将一个32位数从主机字节顺序转换为网络字节顺序
uint16_t htons(uint16_t hostshort); // 将一个16位数从主机字节顺序转换为网络字节顺序
uint32_t ntohl(uint32_t netlong); // 将一个32位数从网络字节顺序转换为主机字节顺序
uint16_t ntohs(uint16_t netshort); // 将一个16位数从网络字节顺序转换为主机字节顺序

相关文章:

tcp发送整型,结构体等数据的方法

测试环境 Receiver: x86 UbuntuSender: arm64 android 发送整型数 C语言和套接字库来发送一个整型变量&#xff08;int&#xff09;的客户端程序。 它首先创建一个TCP套接字&#xff0c;然后连接到指定的服务器地址和端口。接着&#xff0c;它将一个整型变量&#xff08;in…...

【Unity每日一记】让一个物体按余弦曲线移动—(三角函数的简单运用)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…...

python爬虫实战——数据可视化

本篇文章将介绍如何利用Python爬虫获取数据并进行可视化展示&#xff0c;包括以下主要内容&#xff1a; 数据获取&#xff1a;使用requests库发送HTTP请求获取目标网页的数据&#xff1b;数据解析&#xff1a;使用BeautifulSoup库对HTML代码进行解析提取所需数据&#xff1b;数…...

案例13 Spring MVC参数传递案例

基于Spring MVC实现HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON方式的参数传递。 1. 创建项目 选择Maven快速构建web项目&#xff0c;项目名称为case13-springmvc02。 2. 配置Maven依赖 <?xml version"1.0" encoding"UTF-8&quo…...

IntellIJ Idea 连接数据库-MySql

前言&#xff1a;可以用mariaDB工具&#xff0c;在本地创建服务器主机和数据库&#xff0c;而后用intellIJ Idea尝试连接 MariaDB创建数据库练习 1.IntellIJ Idea打开界面右侧Database工具&#xff0c;选择MySQL数据库。 2.填写数据库账号密码&#xff0c;地址端口号&#xff…...

通讯协议036——全网独有的OPC HDA知识一之聚合(五)计数

本文简单介绍OPC HDA规范的基本概念&#xff0c;更多通信资源请登录网信智汇(wangxinzhihui.com)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化&#xff0c;以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&…...

【TensorFlow】P0 Windows GPU 安装 TensorFlow、CUDA Toolkit、cuDNN

Windows 安装 TensorFlow、CUDA Toolkit、cuDNN 整体流程概述TensorFlow 与 CUDA ToolkitTensorFlow 是一个基于数据流图的深度学习框架CUDA 充分利用 NIVIDIA GPU 的计算能力CUDA Toolkit cuDNN 安装详细流程整理流程一&#xff1a;安装 CUDA Toolkit步骤一&#xff1a;获取CU…...

基于身份的安全威胁正在迅速增长

根据端点安全和威胁情报供应商 CrowdStrike 发布的一份报告&#xff0c;目前最危险的网络安全威胁是能够访问给定系统合法身份信息的攻击者。 根据该报告&#xff0c;交互式入侵&#xff08;该公司将其定义为攻击者积极工作以在受害者系统上实现某种非法目的的入侵&#xff09;…...

解决ElementUI动态表单校验验证不通过

这里记录一下&#xff0c;写项目时遇到的一个问题&#xff1a;就是动态渲染的表单项&#xff0c;加验证规则后一直不通过&#xff01;&#xff01;&#xff01; 原代码 html部分&#xff1a; <el-form-itemv-for"(teaclass,index) in addFom.classIds":label&quo…...

深眸科技|发现AI+3D视觉的价值,技术升级加速视觉应用产品国产替代

随着中国工业化进程的不断深入和智能制造浪潮的影响&#xff0c;工业生产对于机器视觉技术的需求不断攀升&#xff0c;其应用范围覆盖了工业领域的众多行业&#xff0c;包括3C电子、汽车、半导体、新能源、物流等。 据GGII发布的最新数据显示&#xff0c;近年来我国机器视觉市…...

云计算-知识点大纲

前言&#xff1a;云计算的基本概念学习&#xff0c;基础知识大纲梳理。 目录 云计算的概念 云计算的特征 部署模式 服务模式 云计算的发展 云计算的核心技术 虚拟化技术 常见的虚拟化技术 服务器虚拟化 裸金属型技术 服务器虚拟化技术的特点 存储虚拟化 CPU 内存…...

设计模式(2)工厂方法模式

一、 1、介绍&#xff1a;定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断&#xff0c;根据客户端的选择条件动态实例化相关的类&#xff0c;对于客户端来说…...

如何创建51单片机KEIL工程

如何创建51单片机KEIL工程步骤&#xff1a; &#xff08;1&#xff09;打开keil软件&#xff0c;点击工具栏-Project&#xff0c;选择创建新的工程&#xff1b; &#xff08;2&#xff09;然后给工程命名&#xff0c;文章以project为例&#xff0c;然后点击保存 &#xff08…...

openGauss学习笔记-34 openGauss 高级数据管理-SCHEMA

文章目录 openGauss学习笔记-34 openGauss 高级数据管理-SCHEMA34.1 语法格式34.2 参数说明34.3 示例 openGauss学习笔记-34 openGauss 高级数据管理-SCHEMA SCHEMA又称作模式。通过管理SCHEMA&#xff0c;允许多个用户使用同一数据库而不相互干扰&#xff0c;可以将数据库对象…...

虚拟世界探索:科技之下的未来可能性

随着科技的飞速发展&#xff0c;人们对于虚拟世界的憧憬和探索也日益加深。虚拟世界&#xff0c;那是一个超越现实的概念&#xff0c;一个充满想象力和创造力的领域。然而&#xff0c;虚拟世界究竟有可能实现吗&#xff1f;这是一个引人深思的问题。 虚拟世界&#xff0c;首先让…...

OSPF技术入门(第三十四课)

1 OSPF的介绍 OSPF是一种链路状态路由协议,主要用于IP网络中的路由选择。它是一种开放协议,能够在不同的网络设备之间进行通信。OSPF利用链路状态数据库来描述网络拓扑结构,并通过Dijkstra算法计算出最短路径。它支持按照精确度划分的路由优先级,以及多个相等的路径,并能自…...

春秋云镜 CVE-2022-0948

春秋云镜 CVE-2022-0948 WordPress plugin Order Listener for WooCommerce SQLI 靶标介绍 WordPress 插件 Order Listener for WooCommerce 3.2.2 之前版本存在 SQL注入漏洞。 启动场景 漏洞利用 EXP curl http://example.com/?rest_route/olistener/new --data {"…...

【资讯速递】AI与人类思维的融合;OpenAI在中国申请注册“GPT-5”商标;移动大模型主要面向to B 智能算力是未来方向

2023年8月11日 星期五 癸卯年六月廿五 第000001号 欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于IT资讯速递专栏,本专栏主要用于发布各种IT资讯&#xff0c;为大家可以省时省力的就能阅读和了解到行业的一些新资讯 资…...

TDesign中后台管理系统-用户登录

目录 1 创建用户表2 开发后端接口3 测试接口4 修改登录页面调用后端接口最终效果总结 中后台系统第一个要实现的功能就是登录了&#xff0c;我们通常的逻辑是让用户在登录页面输入用户名和密码&#xff0c;调用后端接口去验证用户的合法性&#xff0c;然后根据接口返回的结果进…...

RN 使用react-navigation写可以滚动的横向导航条(expo项目)

装包&#xff1a; yarn add react-navigation/material-top-tabs react-native-tab-view npx expo install react-native-pager-view import React from react import { View, Text, ScrollView, SafeAreaView } from react-native import { Icon } from ../../../../../compo…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...