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

这篇具有很好参考价值的文章主要介绍了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);
    }
#else
    unsigned 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);
    }

    // 监听客户端的连接请求,设置最大连接数为5
    if (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位数从网络字节顺序转换为主机字节顺序文章来源地址https://www.toymoban.com/news/detail-642795.html

到了这里,关于tcp发送整型,结构体等数据的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【QT实现TCP数据发送和接收】

    单客户端服务器实现代码: 在.pro文件添加 在头文件中添加 在源文件中添加

    2024年02月11日
    浏览(52)
  • python模拟TCP与UDP发送数据包

    在项目测试中需要发送指定内容的数据包到目标位置,并且需要发送的数量极大,真实环境无法满足测试需求,但是以Python为基础语言,结合Socket和Scrapy便可以支撑测试,其中Socket可以支持大量数据包由本机发送给目标机,scapy则可以模拟发生源IP发送数据包给目标及,但每秒

    2024年02月05日
    浏览(43)
  • Linux 下 nc 发送接收 udp、tcp数据

    nc,全名叫 netcat,它可以用来完成很多的网络功能,譬如端口扫描、建立TCP/UDP连接,数据传输、网络调试等等,因此,它也常被称为网络工具的 瑞士军刀 。 一、只服务端使用nc 备注:这种方式只能发送一次数据,不能互相发送 1、udp发送接收数据,udp本质不区分客户端服务

    2024年02月16日
    浏览(41)
  • TCP解帧解码、并发送有效数据到FPGA

    工程的功能:使用TCP协议接收到网络调试助手发来的指令,将指令进行解帧,提取出帧头、有限数据、帧尾;再将有效数据发送到FPGA端的BRAM上,实现信息传递。 参考:正点原子启明星ZYNQ之嵌入式SDK开发指南_V2.0:第三十九章 基于 TCP 协议的远程更新 QSPI Flash 实验 和 第十五

    2024年02月05日
    浏览(38)
  • Java基础---常用类大全以及各数据结构的方法大全

    目录 前言 一、Math类 二.Scanner类 三、String类、StringBuilder和StringBuffer类 💖String类 💖StringBuilder和StringBuffer 四.Arrays类 五.Random类 六.时间类 七.ArrayList顺序表 八、LinkedList与链表 九.Stack栈和Queue队列 十.PriorityQueue优先级队列,堆 🎁博主介绍:博客名为tq02,已学C语言、JavaSE,目

    2024年02月16日
    浏览(41)
  • 【STM32 物联网】AT指令与TCP,发送与接收数据

    随着物联网(IoT)技术的迅速发展,越来越多的设备和系统开始连接到互联网,实现远程监控、数据采集和远程控制等功能。在物联网应用中,STM32微控制器以其强大的性能和丰富的外设功能成为了重要的选择之一。而在STM32与互联网通信中,AT指令与TCP/IP协议成为了两个重要

    2024年02月22日
    浏览(42)
  • TCP和UDP协议发送数据包的大小方面的知识介绍

    MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一

    2024年02月05日
    浏览(42)
  • uniapp 开发微信小程序使用TCP/UDP通信以16进制发送数据

    在微信小程序中实现像网络调试工具按16进制发送的功能。 如下图调试工具接收到微信小程序发送的16进制数据 以上代码是在 uniapp 开发工具进行编写,然后编译 运行到小程序模拟器才能正常使用。如果直接用微信开发者工具编译,会报错: ReferenceError: Buffer is not defined 源码

    2024年02月15日
    浏览(48)
  • SpringBoot中使用Netty实现TCP通讯,服务器主动向客户端发送数据

    Springboot项目的web服务后台,web服务运行在9100端口。 后台使用netty实现了TCP服务,运行在8000端口。 启动截图如下: 启动类修改: 服务器查看当前所有连接的客户端  服务器获取到所有客户单的ip地址及端口号后,即可通过其给指定客户端发送数据  

    2024年02月11日
    浏览(43)
  • 智能小车(八)ros实现将智能小车数据通过TCP/IP发送到上位机网关

    ros实现将智能小车数据通过TCP/IP发送到上位机网关 这里主要注意: 将浮点型数据*1000转换成int型数据然后分字节储存(另取一个字节作为符号位)。没有用struct.pack进行字节流打包,原因是不同平台,字节流的打包浮点型数据不一样,又要加上包头等校验信息,所以这里分别用

    2024年01月22日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包