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

深圳三大巨头企业佛山网站的优化

深圳三大巨头企业,佛山网站的优化,专门教做西餐的网站,广西建设网培训中心在套接字(Socket)通信中,字节序(Endianness)是指多字节数据在内存或网络传输中的存储顺序。主要有两种字节序: 大端字节序(Big-Endian):最高有效字节(MSB&…

在套接字(Socket)通信中,字节序(Endianness)是指多字节数据在内存或网络传输中的存储顺序。主要有两种字节序:

  1. 大端字节序(Big-Endian):最高有效字节(MSB,Most Significant Byte)存储在低地址,最低有效字节(LSB,Least Significant Byte)存储在高地址。例如:

    int num = 0x12345678;
    

    在大端模式下,内存存储顺序为:

    0x12 0x34 0x56 0x78
    
  2. 小端字节序(Little-Endian):最低有效字节(LSB)存储在低地址,最高有效字节(MSB)存储在高地址。例如:

    0x78 0x56 0x34 0x12
    

套接字通信中的字节序

网络通信通常涉及不同架构的计算机,而不同架构可能使用不同的字节序。为了保证数据的可移植性,网络协议统一采用大端字节序(即网络字节序,Network Byte Order)。这意味着,在发送数据时,需要将数据转换为大端格式;在接收数据时,需要从大端格式转换回主机字节序。

字节序转换函数

在C/C++的Socket编程中,提供了一组字节序转换函数,用于在主机字节序和网络字节序之间进行转换:

  • 主机字节序 → 网络字节序

    • htons():转换16位无符号短整数(short)
    • htonl():转换32位无符号整数(long)
  • 网络字节序 → 主机字节序

    • ntohs():转换16位无符号短整数(short)
    • ntohl():转换32位无符号整数(long)

示例代码

#include <stdio.h>
#include <stdint.h>
#include <arpa/inet.h>int main() {uint16_t host_short = 0x1234;uint32_t host_long = 0x12345678;uint16_t net_short = htons(host_short);uint32_t net_long = htonl(host_long);printf("Host short: 0x%x, Network short: 0x%x\n", host_short, net_short);printf("Host long: 0x%x, Network long: 0x%x\n", host_long, net_long);return 0;
}

运行结果(假设主机是小端字节序):

Host short: 0x1234, Network short: 0x3412
Host long: 0x12345678, Network long: 0x78563412

这样,在网络传输时,所有数据都被转换为大端格式,不同架构的计算机都可以正确解析数据。

无论是客户端还是服务器,发送数据时都应该转换为大端(网络字节序)后再发送,接收数据时再转换回主机字节序。这样可以确保不同架构的计算机都能正确解析数据。

发送数据时:

  1. 先检查主机的字节序(小端或大端)。
  2. 使用 htonl()(32位)或 htons()(16位)将数据转换为 大端字节序
  3. 通过 send()sendto() 发送数据。

接收数据时:

  1. 通过 recv()recvfrom() 接收数据。
  2. 使用 ntohl()(32位)或 ntohs()(16位)将数据从 大端字节序转换回主机字节序
  3. 解析和使用数据。

代码示例:

服务器端(接收整数并转换回主机字节序)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>#define PORT 8080int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);uint32_t net_data, host_data;// 创建 socketserver_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_fd == 0) {perror("Socket failed");exit(EXIT_FAILURE);}// 配置服务器地址address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 绑定 socketif (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("Bind failed");exit(EXIT_FAILURE);}// 监听连接if (listen(server_fd, 3) < 0) {perror("Listen failed");exit(EXIT_FAILURE);}printf("Waiting for connection...\n");new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);if (new_socket < 0) {perror("Accept failed");exit(EXIT_FAILURE);}// 接收数据(网络字节序)recv(new_socket, &net_data, sizeof(net_data), 0);// 转换为主机字节序host_data = ntohl(net_data);printf("Received data (Network Byte Order): 0x%x\n", net_data);printf("Converted to Host Byte Order: %u\n", host_data);close(new_socket);close(server_fd);return 0;
}

客户端(发送整数,转换为大端字节序)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>#define PORT 8080int main() {int sock = 0;struct sockaddr_in serv_addr;uint32_t host_data = 12345;  // 主机字节序uint32_t net_data;// 创建 socketsock = socket(AF_INET, SOCK_STREAM, 0);if (sock < 0) {perror("Socket creation error");return -1;}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);// 连接服务器if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {perror("Invalid address/ Address not supported");return -1;}if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {perror("Connection failed");return -1;}// 转换为网络字节序net_data = htonl(host_data);// 发送数据send(sock, &net_data, sizeof(net_data), 0);printf("Sent data (Host Byte Order): %u\n", host_data);printf("Converted to Network Byte Order: 0x%x\n", net_data);close(sock);return 0;
}

运行流程:

  1. 服务器端运行,等待连接:

    Waiting for connection...
    
  2. 客户端连接服务器并发送整数 12345(转换为大端字节序 0x00003039):

    Sent data (Host Byte Order): 12345
    Converted to Network Byte Order: 0x3039
    
  3. 服务器端接收到数据并转换回主机字节序:

    Received data (Network Byte Order): 0x3039
    Converted to Host Byte Order: 12345
    

总结:

  1. 所有数据在发送前都要转换为网络字节序(大端),无论是客户端还是服务器。
  2. 接收数据后,需要转换回主机字节序,保证程序能够正确解析数据。
  3. 使用 htonl()htons() 进行发送转换,ntohl()ntohs() 进行接收转换,确保跨平台兼容性。

文章转载自:

http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://00000000.knzhy.cn
http://www.dtcms.com/wzjs/617710.html

相关文章:

  • 北京网站建设哪个好重庆网站公司制作价格
  • 简洁大方网站建设游戏类网站怎么做
  • 科技未来网站建设中国肩章大全
  • 棋牌代理平台合肥网站优化平台
  • 汕头站扩建进展品牌建设的意义和重要性
  • 英文网站定制公司什么叫网站降权
  • 湖北省级建设主管部门网站网站建设不好
  • 免费网站排名优化南宁市建设工程造价信息网
  • php网站的优势广元建设机械网站
  • 网站 建设 毕业设计 要求中国电信全渠道运营中心
  • 华侨城网站开发wordpress采集网站
  • 网站竞价 英文网站后台如何上传图片
  • 北京燕华工程建设有限公司网站工程网站建设方案
  • 电子商务网站建设特色0基础如何快速做网站
  • 企业网站建设的层次网页制作与网站建设思维导图
  • 张家界做网站找哪家好免费源码分享网站
  • 专做立体化的网站超级优化空间
  • 柬埔寨做网站网站是用什么语言写的
  • python开发微信小程序金融seo公司
  • 搭建网站哪个好学 网站开发
  • 长春市网站制作公司asp网站首页模板
  • 网站建设 设计创意wordpress迷
  • 福建网站开发招聘怎么加入平台卖货
  • windows2008 iis网站 指定域名公众号内容制作步骤
  • 网博士自助建站系统下载百度打开百度搜索
  • 网站开发可选择的方案有哪些资阳网站推广
  • 做网站设计需要什么软件做网站seo的公司
  • 客户为什么要做网站伪静态网站入侵
  • 网站建设简介是什么意思行业网站模版
  • 网站建设与思想阵地Wordpress热门评论插件