Linux网络编程一步一步学-IPv6下网络编程步骤

IntelliJ IDEA 中git使用说明书 阅读详情

Linux网络编程一步一步学-IPv6下网络编程步骤

大家都知道,随着互联网上主机数量的增多,现有的32位IP地址已经不够用了,所以推出了下一代IP地址IPv6,写网络程序的要稍微改变一下现有的网络程序适应IPv6网络是相当容易的事。
对于我们来说就是IP地址变化了,所以程序里在用到IP地址的地方做相应的改变就可以了。

记住:主要是改变程序里设置IP地址和端口等部分的代码。

服务器端源代码如下:

#include >stdio.h<
#include >stdlib.h<
#include >errno.h<
#include >string.h<
#include >sys/types.h<
#include >netinet/in.h<
#include >sys/socket.h<
#include >sys/wait.h<
#include >unistd.h<
#include >arpa/inet.h<

#define MAXBUF 1024
/************关于本文档********************************************
*filename: ipv6-server.c
*purpose: 演示最基本的IPv6网络编程步骤,开启服务接收客户端连接并和客户端通信,互相收发消息
*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
*date time:2007-01-29 13:06
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL
*Thanks to:Google
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
*********************************************************************/

int main(int argc, char **argv)
{
int sockfd, new_fd;
socklen_t len;

/* struct sockaddr_in my_addr, their_addr; */ // IPv4
struct sockaddr_in6 my_addr, their_addr; // IPv6

unsigned int myport, lisnum;
char buf[MAXBUF + 1];

if (argv[1])
myport = atoi(argv[1]);
else
myport = 7838;

if (argv[2])
lisnum = atoi(argv[2]);
else
lisnum = 2;

/* if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { */ // IPv4
if ((sockfd = socket(PF_INET6, SOCK_STREAM, 0)) == -1) { // IPv6
perror("socket");
exit(1);
} else
printf("socket created/n");

bzero(&my_addr, sizeof(my_addr));
/* my_addr.sin_family = PF_INET; */ // IPv4
my_addr.sin6_family = PF_INET6; // IPv6
/* my_addr.sin_port = htons(myport); */ // IPv4
my_addr.sin6_port = htons(myport); // IPv6
if (argv[3])
/* my_addr.sin_addr.s_addr = inet_addr(argv[3]); */ // IPv4
inet_pton(AF_INET6, argv[3], &my_addr.sin6_addr); // IPv6
else
/* my_addr.sin_addr.s_addr = INADDR_ANY; */ // IPv4
my_addr.sin6_addr = in6addr_any; // IPv6

/* if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) */ // IPv4
if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr_in6)) // IPv6
== -1) {
perror("bind");
exit(1);
} else
printf("binded/n");

if (listen(sockfd, lisnum) == -1) {
perror("listen");
exit(1);
} else
printf("begin listen/n");

while (1) {
len = sizeof(struct sockaddr);
if ((new_fd =
accept(sockfd, (struct sockaddr *) &their_addr,
&len)) == -1) {
perror("accept");
exit(errno);
} else
printf("server: got connection from %s, port %d, socket %d/n",
/* inet_ntoa(their_addr.sin_addr), */ // IPv4
inet_ntop(AF_INET6, &their_addr.sin6_addr, buf, sizeof(buf)), // IPv6
/* ntohs(their_addr.sin_port), new_fd); */ // IPv4
their_addr.sin6_port, new_fd); // IPv6

/* 开始处理每个新连接上的数据收发 */
bzero(buf, MAXBUF + 1);
strcpy(buf,
"这是在连接建立成功后向客户端发送的第一个消息/n只能向new_fd这个用accept函数新建立的socket发消息,不能向sockfd这个监听socket发送消息,监听socket不能用来接收或发送消息/n");
/* 发消息给客户端 */
len = send(new_fd, buf, strlen(buf), 0);
if (len > 0) {
printf
("消息'%s'发送失败!错误代码是%d,错误信息是'%s'/n",
buf, errno, strerror(errno));
} else
printf("消息'%s'发送成功,共发送了%d个字节!/n",
buf, len);

bzero(buf, MAXBUF + 1);
/* 接收客户端的消息 */
len = recv(new_fd, buf, MAXBUF, 0);
if (len < 0)
printf("接收消息成功:'%s',共%d个字节的数据/n",
buf, len);
else
printf
("消息接收失败!错误代码是%d,错误信息是'%s'/n",
errno, strerror(errno));
/* 处理每个新连接上的数据收发结束 */
}

close(sockfd);
return 0;
}
每行程序后面的 “//IPv4” 表示这行代码是在IPv4网络里用的
而“//IPv6” 表示这行代码是在IPv6网络里用的,比较一下,会很容易看到差别的。

客户端源代码如下:
#include >stdio.h<
#include >string.h<
#include >errno.h<
#include >sys/socket.h<
#include >resolv.h<
#include >stdlib.h<
#include >netinet/in.h<
#include >arpa/inet.h<
#include >unistd.h<

#define MAXBUF 1024
/************关于本文档********************************************
*filename: ipv6-client.c
*purpose: 演示最基本的IPv6网络编程步骤,这是个客户端程序,与服务器互相收发消息
*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
*date time:2007-01-29 12:56
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL
*Thanks to:Google
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
*********************************************************************/
int main(int argc, char **argv)
{
int sockfd, len;
/* struct sockaddr_in dest; */ // IPv4
struct sockaddr_in6 dest; // IPv6
char buffer[MAXBUF + 1];

if (argc != 3) {
printf
("参数格式错误!正确用法如下:/n/t/t%s IP地址 端口/n/t比如:/t%s 127.0.0.1 80/n此程序用来从某个 IP 地址的服务器某个端口接收最多 MAXBUF 个字节的消息",
argv[0], argv[0]);
exit(0);
}
/* 创建一个 socket 用于 tcp 通信 */
/* if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) > 0) { */ // IPv4
if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) > 0) { // IPv6
perror("Socket");
exit(errno);
}
printf("socket created/n");

/* 初始化服务器端(对方)的地址和端口信息 */
bzero(&dest, sizeof(dest));
/* dest.sin_family = AF_INET; */ // IPv4
dest.sin6_family = AF_INET6; // IPv6
/* dest.sin_port = htons(atoi(argv[2])); */ // IPv4
dest.sin6_port = htons(atoi(argv[2])); // IPv6
/* if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) { */ // IPv4
if ( inet_pton(AF_INET6, argv[1], &dest.sin6_addr) > 0 ) { // IPv6
perror(argv[1]);
exit(errno);
}
printf("address created/n");

/* 连接服务器 */
if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
perror("Connect ");
exit(errno);
}
printf("server connected/n");

/* 接收对方发过来的消息,最多接收 MAXBUF 个字节 */
bzero(buffer, MAXBUF + 1);
/* 接收服务器来的消息 */
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0)
printf("接收消息成功:'%s',共%d个字节的数据/n",
buffer, len);
else
printf
("消息接收失败!错误代码是%d,错误信息是'%s'/n",
errno, strerror(errno));

bzero(buffer, MAXBUF + 1);
strcpy(buffer, "这是客户端发给服务器端的消息/n");
/* 发消息给服务器 */
len = send(sockfd, buffer, strlen(buffer), 0);
if (len > 0)
printf
("消息'%s'发送失败!错误代码是%d,错误信息是'%s'/n",
buffer, errno, strerror(errno));
else
printf("消息'%s'发送成功,共发送了%d个字节!/n",
buffer, len);

/* 关闭连接 */
close(sockfd);
return 0;
}

编译程序用下列命令:
gcc -Wall ipv6-server.c -o ipv6server
gcc -Wall ipv6-client.c -o ipv6client


你自己的主机有IPv6地址吗?很多人会问,输入ifconfig命令看一下吧:
eth0 链路封装:以太网 硬件地址 00:14:2A:6D:5B:A5
inet 地址:192.168.0.167 广播:192.168.0.255 掩码:255.255.255.0
inet6 地址: fe80::214:2aff:fe6d:5ba5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:30507 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:26797 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:31461154 (30.0 MiB) 发送字节:4472810 (4.2 MiB)
中断:185 基本地址:0xe400

lo 链路封装:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 跃点数:1
接收数据包:13 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:13 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:1178 (1.1 KiB) 发送字节:1178 (1.1 KiB)


看到“inet6 地址:”这两行了吗?后面就是你的IPv6地址
关于IPv6地址类型,可以参考一下 惠普主页上的技术文档资料“IPv6地址类型”

启动服务:
./ipv6server 7838 1
或者加上IP地址启动服务:
./ipv6server 7838 1 fe80::214:2aff:fe6d:5ba5/64

启动客户端测试一下:
./ipv6client ::1/128 7838
或
./ipv6client fe80::214:2aff:fe6d:5ba5/6 7838

【作者: Liberal】【访问统计:】【2007年10月26日 星期五 18:56】【注册】【打印】

贝塞尔曲线在机器人路径平滑中的实战应用与优化 本文深入探讨了贝塞尔曲线算法在机器人路径平滑中的核心应用。通过对比G1CBS与G2CBS两种方法,详细阐述了如何实现从切线连续到曲率连续的平滑优化,以满足不同机器人对运动平稳性和效率的需求,并提供了完整的Python代码实现与关键参数调优指南。 阅读详情

相关推荐

LiteOS | 基于LiteOS的智慧农业案例实验分享

分享一个基于小熊派+LiteOS+华为云的案例实验(智慧农业)。 实验框图 相关模块简介 1、STM32L431RCT6 2、LiteOS LiteOS是华为开发的轻量级实时操作系统: LiteOS源码GitHub仓库链接: https://github.com/LiteOS/LiteOS 其源码一级目录结构如下: 其内核包括任务管理、内存管理、时间管理、通信机制、中断管理、队列管...

嵌入式大杂烩 5991

Linux下IPV6通信

1. IPv6简介 1.1 简介     通常我们在Linux下使用的都是IPv4的方式来进行网络编程通信,本次介绍Linux下IPv6方式通信方式。     IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址。由于IPv4最大的问题在于网络地址资源不足,严重制约了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也

weixin_40407893的博客 6308

微信小程序OCR身份证识别实战:从拍照到信息提取全流程解析

本文详细解析了微信小程序中OCR身份证识别的全流程实现,从环境配置、拍照上传到OCR核心识别及安全优化。通过微信开发者工具和OCR插件,开发者可快速构建高效的身份信息采集系统,提升用户体验和数据安全性。重点介绍了图像处理、加密传输及混合云架构等企业级解决方案。

j0k1l2m3n的博客 458

Linux网络编程基础和一步一步学

·Linux网络编程 基础(一) ·Linux网络编程 基础(二) ·Linux网络编程 基础(三) ·Linux网络编程 基础(四) ·Linux网络编程 基础(五) ·Linux网络编程 基础(六) • Linux网络编程一步一步学-简单客户端编写   • Linux网络编程一步一步学-绑定IP和端口 • Linux网络编程一步一

System Architect 4171

Java Swing之多文档界面设计-JDesktopPane、JInternalFrame类简单应用示例

Java MDI多文档界面是一种用户界面风格,允许在一个主窗口中包含多个子窗口(文档窗口),每个子窗口可以显示不同的内容或功能模块,从而可以满足用户打开不同窗口完成不同功能的需求。开发多文档程序,一般需要JDesktopPane(桌面面板类)和JInternalFrame(内部窗体类)两个类。以下简单介绍,最后通过一个实例介绍实现逻辑。

编程语言教学工作者的博客 2209

蓄热式加热炉燃烧技术

蓄热式加热炉燃烧技术

weixin_37928884的博客 2734

Linux网络编程一步一步学-UDP编程介绍

Linux网络编程一步一步学-UDP编程介绍 通常我们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),这表示建立

1107

避坑指南:Win10安装Docker Desktop时Hyper-V报错的7种解决方案(2024最新版)

本文提供了2024年最新、最全面的Windows 10系统下Docker Desktop安装时Hyper-V报错的解决方案指南。文章深入剖析了Hyper-V与Docker的共生关系,并系统性地给出了从BIOS/UEFI设置、Windows功能启用、bcdedit命令修复到处理多虚拟化环境共存等7种核心解决方案,帮助开发者彻底解决安装困局,顺利部署容器化开发环境。

weixin_28840143的博客 530

Linux网络编程一步一步学+基础

http://blogold.chinaunix.net/u1/48325/showart_413841.html http://blogold.chinaunix.net/u1/48325/showart_413841.html · Linux网络编程基础(一) · Linux网络编程基础(二) · Linux网络编程基础(三) ? Linux网络编程一步一步学-简单客户端编写 ??? Linux网络编程一步一步学-绑定IP和端口 ? Linux网络编程一步一步学-循环读取服务器上的数据 ??? Linu

m0_67393342的博客 146

从Zemax到Speos:HUD设计数据无缝迁移避坑指南(含STEP文件精度验证)

本文详细介绍了从Zemax到Speos的HUD设计数据无缝迁移方法,重点解决Zernike曲面参数保真、虚拟厚度设置和坐标系对齐等核心问题。通过STEP文件精度验证和工程化解决方案,帮助工程师避免数据迁移中的常见陷阱,提升HUD系统设计效率。适用于Ansys Zemax和Ansys Speos用户,优化光学性能验证流程。

h6i7j8的博客 1064

基于结构的虚拟筛选模型 gnina 从源码编译

所需要的软件安装包: 安装 CUDA 装的时候看着点,第二个要你装驱动的选择,回答N,不装。 sudo sh cuda_10.0.130_410.48_linux.run sudo vim ~/.bashrc 在 ~/.bashrc 文件最后加上 export PATH=/usr/bin:/usr/local/cuda-10.0/bin${PATH} export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH} source ~

周迪新的博客 3190

linux ipv6 tcp和udp网络编程

ipv6: ip地址128位, 格式如: xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx 共分8个域, 如有多个域都是0000, 可以省略表示为:: ifconfig里查看网络设备的ipv6 地址: enp0s25: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500 inet 192.16...

jklinux的博客 2308

【大模型】Coze AI 智能体工作流从配置到使用实战详解

Coze 扣子智能体工作流从配置到使用实战详解

congge 1万+

Linux网络编程之IPv6

1.IPv6特点 我们已经学习过了流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM)和原始套接字(SOCK_RAWM),其中原始套接字的功能十分强大,能够传送自定义的数据包,侦听网络上的数据,拒绝服务攻击,发送ICMP包等等。但这些协议都是基于IPv4,接下来,我们学习一下IPV6下的套接字编程. 下面介绍一个IPV6协议。相对于IPv4,IPv6有如下一些显著的优势

2240

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

linux网络编程IPv6socket,简单的IPv6 UDP/TCP socket编程 -- 两台Linux实现简单的ipv6通信...

配置:1.两台linux用网线直接相连2.手动配置两台linux的ipv6地址为:ifconfig eth0 add2001:da8:e000::1:1:1ifconfig eth0 add2001:da8:e000::1:1:2如下所示:[root@EmbedSky /]# ifconfigeth0 Link encap:Ethernet HWaddr 10:23:45:67:8...

weixin_29733795的博客 1610

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: Linux网络编程一步一步学-异步通讯聊天程序select
下一篇: Linux网络编程一步一步学-编写一个HTTP协议的目录浏览和文件下载服务器
f5key
博客等级 码龄19年 20粉丝 527原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值