网络字节序验证
网络字节序(Network Byte Order)是一种在网络上发送数据时约定的字节序,它规定了大端(Big-Endian)表示法。也就是说,在网络传输数据时,数据的"最高位字节"(big-endian)排放在数据的"最前面"。这种约定保证了数据在不同架构的计算机系统之间交换时的一致性,因为不同的系统可能使用不同的字节序(大端或小端)。
为了验证网络字节序,我们可以使用一段简单的代码来检查主机字节序,并将其转换为网络字节序来进行验证。
下面是一段网络发送数据的代码
send.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
int sock_fd;
struct sockaddr_in serv_addr;
// 创建套接字
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (sock_fd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置服务器地址
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); // 回环地址
serv_addr.sin_port = htons(12345);
// 准备发送数据
char buffer[1024];
buffer[0] = 0x11;
buffer[1] = 0x22;
uint32_t tmp = htonl(0x122);
memcpy(buffer+2, (char*)&tmp, sizeof(tmp));
// 发送数据
ssize_t n = sendto(sock_fd, buffer, sizeof(tmp)+2, 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if (n == -1) {
perror("sendto");
exit(EXIT_FAILURE);
}
close(sock_fd);
return 0;
}
下面是一段网络接收数据的代码
recv.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
int sock_fd;
struct sockaddr_in serv_addr, cli_addr;
socklen_t cli_addr_len = sizeof(cli_addr);
// 创建套接字
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (sock_fd == -1) {
perror("