c中in6_addr地址和修改in6_addr地址


in6_addr的结构体:

struct in6_addr
{
    union
    {
        uint8_t __u6_addr8[16];   // 128 bit
        #if defined __USE_MISC || defined __USE_GNU
        uint16_t __u6_addr16[8];  // 64 bit
        uint32_t __u6_addr32[4];  // 32 bit
        #endif
    } __in6_u;
    #define s6_addr         __in6_u.__u6_addr8
    #if defined __USE_MISC || defined __USE_GNU
    # define s6_addr16      __in6_u.__u6_addr16
    # define s6_addr32      __in6_u.__u6_addr32
    #endif
};

结构体中的unit8_t,unit16_t,unit32_t这三个数据类型如下:

typedef unsigned char           uint8_t;  
typedef unsigned short int      uint16_t;  
#ifndef __uint32_t_defined  
typedef unsigned int            uint32_t;  
# define __uint32_t_defined  
#endif 

要想在程序中实现改变ipv6地址的功能,只需要改变in6_addr中u里面的__u6_addr8这个数组里面的内容。

ipv6的格式为X:X:X:X:X:X:X:X,其中每个X表示地址中的16b,以十六进制表示,例如:z的地址是ABCD:EF01:2345:6789:ABCD:EF01:2345:6789

__u6_addr8这个数组里面一共有16个元素,那么平均分配下来每两个元素表示一个X,也就是16b。

__u6_addr8[0]和__u6_addr8[1]代表z地址中第一个16位中的AB和CD。

__u6_addr8[2]和__u6_addr8[3]代表z地址中第二个16位中的EF和01。

__u6_addr8[4]和__u6_addr8[5]代表z地址中第三个16位中的23和45。

以此类推,__u6_addr8数组正好能够将所有的位数都表示。

因为是16进制,所以逢16进1。如果__u6_addr8[0] = 16,__u6_addr8[1] = 10,那么前16位就是:100a。

数组元素里面最大是255,因为两位16进制的数能够表示最大的数就是ff。


in6_addr p;
p.__in6_u.__u6_addr8[0] = 255;
p.__in6_u.__u6_addr8[1] = 255;
p.__in6_u.__u6_addr8[2] = 255;
p.__in6_u.__u6_addr8[3] = 0;
p.__in6_u.__u6_addr8[4] = 0;
p.__in6_u.__u6_addr8[5] = 255;
p.__in6_u.__u6_addr8[6] = 16;
p.__in6_u.__u6_addr8[7] = 1;
p.__in6_u.__u6_addr8[8] = 255;
p.__in6_u.__u6_addr8[9] = 17;
p.__in6_u.__u6_addr8[10] = 15;
p.__in6_u.__u6_addr8[11] = 255;
p.__in6_u.__u6_addr8[12] = 10;
p.__in6_u.__u6_addr8[13] = 10;
p.__in6_u.__u6_addr8[14] = 1;
p.__in6_u.__u6_addr8[15] = 10;

上面程序打印出来的结果就是:ffff:ff00:ff:1001:ff11:fff:a0a:10a

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
修改代码输出时间的方式放止段吐核#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <time.h> // 添加时间头文件int main() { int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字 if (server_socket < 0) { perror("socket"); return 1; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8000); int iResult = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 绑定套接字 if (iResult < 0) { perror("bind"); close(server_socket); return 1; } iResult = listen(server_socket, SOMAXCONN); // 监听套接字 if (iResult < 0) { perror("listen"); close(server_socket); return 1; } printf("服务器已启动,等待连接...\n"); int counter = 0; while (1) { struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); // 接受客户端连接 if (client_socket < 0) { perror("accept"); close(server_socket); return 1; } counter++; printf("客户端 %s:%d 已连接,是今天的第 %d 个客户端。\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), counter); // 添加时间输出 time_t now = time(NULL); struct tm* time_info = localtime(&now); char time_str[20]; strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", time_info); printf("当前时间是:%s\n", time_str); char reply[1024]; sprintf(reply, "你是今天第%d个客户端", counter); send(client_socket, reply, strlen(reply), 0); close(client_socket); } close(server_socket); return 0;}
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值