tcp发送整型,结构体等数据的方法
测试环境
- Receiver: x86 Ubuntu
- Sender: arm64 android
发送整型数
C语言和套接字库来发送一个整型变量(int)的客户端程序。
- 它首先创建一个TCP套接字,然后连接到指定的服务器地址和端口。
- 接着,它将一个整型变量(int)转换为网络字节序(大端),
- 并使用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)的服务器程序。
- 它首先创建一个TCP套接字,然后绑定到指定的地址和端口。
- 接着,它监听客户端的连接请求,并接受一个连接。
- 然后,它使用recv()函数接收客户端发送的整型数据,并将其转换为主机字节序(小端或大端)。
- 最后,它打印出接收到的数据,并关闭套接字。
#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语言和套接字库来发送一个整型变量(int)的客户端程序。 它首先创建一个TCP套接字,然后连接到指定的服务器地址和端口。接着,它将一个整型变量(in…...
【Unity每日一记】让一个物体按余弦曲线移动—(三角函数的简单运用)
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:uni…...
python爬虫实战——数据可视化
本篇文章将介绍如何利用Python爬虫获取数据并进行可视化展示,包括以下主要内容: 数据获取:使用requests库发送HTTP请求获取目标网页的数据;数据解析:使用BeautifulSoup库对HTML代码进行解析提取所需数据;数…...
案例13 Spring MVC参数传递案例
基于Spring MVC实现HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON方式的参数传递。 1. 创建项目 选择Maven快速构建web项目,项目名称为case13-springmvc02。 2. 配置Maven依赖 <?xml version"1.0" encoding"UTF-8&quo…...
IntellIJ Idea 连接数据库-MySql
前言:可以用mariaDB工具,在本地创建服务器主机和数据库,而后用intellIJ Idea尝试连接 MariaDB创建数据库练习 1.IntellIJ Idea打开界面右侧Database工具,选择MySQL数据库。 2.填写数据库账号密码,地址端口号ÿ…...
通讯协议036——全网独有的OPC HDA知识一之聚合(五)计数
本文简单介绍OPC HDA规范的基本概念,更多通信资源请登录网信智汇(wangxinzhihui.com)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化,以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&…...
【TensorFlow】P0 Windows GPU 安装 TensorFlow、CUDA Toolkit、cuDNN
Windows 安装 TensorFlow、CUDA Toolkit、cuDNN 整体流程概述TensorFlow 与 CUDA ToolkitTensorFlow 是一个基于数据流图的深度学习框架CUDA 充分利用 NIVIDIA GPU 的计算能力CUDA Toolkit cuDNN 安装详细流程整理流程一:安装 CUDA Toolkit步骤一:获取CU…...
基于身份的安全威胁正在迅速增长
根据端点安全和威胁情报供应商 CrowdStrike 发布的一份报告,目前最危险的网络安全威胁是能够访问给定系统合法身份信息的攻击者。 根据该报告,交互式入侵(该公司将其定义为攻击者积极工作以在受害者系统上实现某种非法目的的入侵)…...
解决ElementUI动态表单校验验证不通过
这里记录一下,写项目时遇到的一个问题:就是动态渲染的表单项,加验证规则后一直不通过!!! 原代码 html部分: <el-form-itemv-for"(teaclass,index) in addFom.classIds":label&quo…...
深眸科技|发现AI+3D视觉的价值,技术升级加速视觉应用产品国产替代
随着中国工业化进程的不断深入和智能制造浪潮的影响,工业生产对于机器视觉技术的需求不断攀升,其应用范围覆盖了工业领域的众多行业,包括3C电子、汽车、半导体、新能源、物流等。 据GGII发布的最新数据显示,近年来我国机器视觉市…...
云计算-知识点大纲
前言:云计算的基本概念学习,基础知识大纲梳理。 目录 云计算的概念 云计算的特征 部署模式 服务模式 云计算的发展 云计算的核心技术 虚拟化技术 常见的虚拟化技术 服务器虚拟化 裸金属型技术 服务器虚拟化技术的特点 存储虚拟化 CPU 内存…...
设计模式(2)工厂方法模式
一、 1、介绍:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说…...
如何创建51单片机KEIL工程
如何创建51单片机KEIL工程步骤: (1)打开keil软件,点击工具栏-Project,选择创建新的工程; (2)然后给工程命名,文章以project为例,然后点击保存 (…...
openGauss学习笔记-34 openGauss 高级数据管理-SCHEMA
文章目录 openGauss学习笔记-34 openGauss 高级数据管理-SCHEMA34.1 语法格式34.2 参数说明34.3 示例 openGauss学习笔记-34 openGauss 高级数据管理-SCHEMA SCHEMA又称作模式。通过管理SCHEMA,允许多个用户使用同一数据库而不相互干扰,可以将数据库对象…...
虚拟世界探索:科技之下的未来可能性
随着科技的飞速发展,人们对于虚拟世界的憧憬和探索也日益加深。虚拟世界,那是一个超越现实的概念,一个充满想象力和创造力的领域。然而,虚拟世界究竟有可能实现吗?这是一个引人深思的问题。 虚拟世界,首先让…...
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号 欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于IT资讯速递专栏,本专栏主要用于发布各种IT资讯,为大家可以省时省力的就能阅读和了解到行业的一些新资讯 资…...
TDesign中后台管理系统-用户登录
目录 1 创建用户表2 开发后端接口3 测试接口4 修改登录页面调用后端接口最终效果总结 中后台系统第一个要实现的功能就是登录了,我们通常的逻辑是让用户在登录页面输入用户名和密码,调用后端接口去验证用户的合法性,然后根据接口返回的结果进…...
RN 使用react-navigation写可以滚动的横向导航条(expo项目)
装包: 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…...
部署与可视化系统:边缘设备部署:YOLOv8 量化 + NCNN 在树莓派 5 上实时检测
写在前面:当你必须用一块“卡片电脑”跑实时AI推理 如果你拿到过树莓派5,大概率经历过这样的心理路线图: 开机那一刻:“哇,这么小的板子,跑个完整桌面都行!” 装上PyTorch之后:“等等,加载个YOLOv8模型怎么要两分钟?” 真正跑推理的时候:“一秒一帧?PPT都比这流畅…...
【技术解析】轻量级超分新范式:CNN与Transformer混合架构的设计与实践
1. 为什么需要轻量级超分技术? 想象一下你用手机拍了一张照片,放大后发现细节模糊不清——这就是低分辨率图像放大的典型问题。传统超分辨率算法要么效果差强人意,要么需要消耗大量计算资源。在实际应用中,我们常常面临这样的矛盾…...
移动端架构演进与选型
移动端架构演进与选型:从单体到模块化的技术探索 移动互联网的快速发展对移动端架构提出了更高要求。从早期的单体架构到如今的模块化、组件化设计,移动端架构的演进始终围绕性能、可维护性和动态化展开。面对业务复杂度的提升,如何选择合适…...
【YOLOv11】044、YOLOv11与半监督学习:利用无标签数据提升模型性能
从一次深夜调试说起 上周三凌晨两点,我在实验室盯着训练曲线发愁。客户给了一批十万张的未标注道路图像,要求用现有的三千张标注数据训练一个高精度YOLOv11模型。三千对十万,这差距让我对着屏幕抽完了半包烟。常规训练的结果在验证集上mAP卡在0.62就上不去了,过拟合的迹象…...
从零到一:基于STM32硬件SPI驱动M95系列EEPROM的实战指南
1. 硬件SPI与EEPROM基础概念 第一次接触STM32的硬件SPI驱动EEPROM时,我也被各种专业术语搞得头晕眼花。简单来说,SPI就像两个人在用摩斯密码交流——主设备(STM32)通过四根线(MOSI、MISO、SCK、NSS)与从设备…...
单片机软件架构实战:从新手到高手的9种设计模式
1. 单片机软件架构入门:从main函数到模块化设计 刚接触单片机编程时,我们往往从一个简单的main函数开始。记得我第一次用51单片机点亮LED时,代码简单到只有十几行: #include <reg51.h> void main() {while(1) {P1 0x00; …...
ARM A78AE实战:手把手教你配置L1 Cache的Memory Type与属性(避坑Device nGnRnE)
ARM Cortex-A78AE内存属性配置实战:从原理到避坑指南 在嵌入式系统开发中,正确配置处理器的内存属性是确保系统稳定性和性能的关键环节。作为ARM最新一代的实时处理器核心,Cortex-A78AE对内存类型(Memory Type)和属性的…...
Python asyncio 调度机制性能优化
Python asyncio调度机制性能优化 在现代高并发的网络应用中,Python的asyncio库凭借其高效的异步IO能力成为开发者的首选。随着业务复杂度的提升,默认的调度机制可能无法充分发挥性能潜力。本文将深入探讨asyncio调度机制的性能优化策略,帮助…...
预约软件测评2026
2026 中国市场预约软件全景测评:自由职业者与本地商家如何选?预约管理正成为越来越多自由职业者、一人企业(OPC)和本地生活商家的刚需。从咨询师到美甲店,谁都需要一套让客户自助预约、自动确认的工具——但市面上产品…...
保姆级教程:用Android TTS实现有声读物App的逐句高亮与播放控制(支持API 26+)
Android TTS高级开发实战:打造沉浸式有声读物应用 有声读物和语言学习类应用的核心体验在于语音与文字的精准同步。想象一下,当用户听到"The quick brown fox jumps over the lazy dog"时,每个单词都能像卡拉OK歌词一样实时高亮&a…...
