linux ipv6 tcp和udp网络编程

关于c语言的udp通讯详细讲解 UDP全称 User Datagram Protocol,即:用户数据报协议。是面向无连接的协议。通常,UDP 通信还会被冠以不可靠的头衔。这里的不可靠指的是:无法可靠地得知对方是否收到数据。 阅读详情

ipv6: ip地址128位, 格式如: xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
共分8个域, 如有多个域都是0000, 可以省略表示为::

ifconfig里查看网络设备的ipv6 地址:
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.250 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::2ad2:44ff:fe1a:fe6 prefixlen 64 scopeid 0x20
// inet6就是表示ipv6地址

ping ipv6地址: 需要指定使用哪个网络设备发出ping包

	ping6 -I enp0s25 fe80::fc80:ecee:20b3:8bc2
	ping -6 -I enp0s25 fe80::fc80:ecee:20b3:8bc2   //新版本系统支持

与ipv4的socket通信最大的不同点:

  1. 创建ipv6的socket时domain指定为AF_INET6:
    
	   tcp6_socket = socket(AF_INET6, SOCK_STREAM, 0);
       raw6_socket = socket(AF_INET6, SOCK_RAW, protocol);
       udp6_socket = socket(AF_INET6, SOCK_DGRAM, protocol);
  1. 使用新地址结构体来描述:
    
           struct sockaddr_in6 {
               sa_family_t     sin6_family;   /* AF_INET6 */
               in_port_t       sin6_port;     /* port number */
               uint32_t        sin6_flowinfo; /* IPv6 flow information */
               struct in6_addr sin6_addr;     /* IPv6 address */
               uint32_t        sin6_scope_id; /* Scope ID (new in 2.4) */
           };

           struct in6_addr {
               unsigned char   s6_addr[16];   /* IPv6 address */
           };
       sin6_family is always set to AF_INET6; sin6_port is the protocol port (see sin_port in ip(7));
       sin6_flowinfo   is   the  IPv6  flow  identifier;  sin6_addr  is  the  128-bit  IPv6  address.
       sin6_scope_id is an ID depending on the scope of the address.  It is new in Linux 2.4.   Linux
       supports  it  only for link-local addresses, in that case sin6_scope_id contains the interface
       index (see netdevice(7))

	其中sin6_scope_id成员当在与服务器端通信时需要指定使用的网络设备index(可通过ioctl(sd, SIOCGIFINDEX, ...)获取)
  1. 当使用字符串的ip地址需要与ipv6的128位地址互转时,可用下面两个函数:
       #include <arpa/inet.h>
       int inet_pton(int af, const char *src, void *dst); //可把字符串表示的ip地址转换ipv4, ipv6地址
		af:  AF_INET表示IPV4,   AF_INET6表示ipv6
		src: 表示字符串的ip地址
		dst: 表示存放转换结果的缓冲区地址
	返回值为1表示转换成功, 0表示字符串是无效的ip地址, -1表示错误.

	 const char *inet_ntop(int af, const void *src,
                             char *dst, socklen_t size); //字ipv4/ipv6地址转换成字符串

tcp测试例子, 服务器端代码:


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

int main(void)
{
	int sd;

	sd = socket(AF_INET6, SOCK_STREAM, 0);
	if (sd < 0)
	{
		perror("socket");
		return 1;
	}

	struct sockaddr_in6 addr = {AF_INET6, htons(10086), 0, IN6ADDR_ANY_INIT};
	if (bind(sd, (struct sockaddr*)&addr, sizeof(addr)) < 0)
	{
		perror("bind");
		return 2;
	}

	listen(sd, 100);
	
	int fd;
	char ip[20];
	struct sockaddr_in6 peer;
	socklen_t len = sizeof(peer);
	while (1)
	{
		fd = accept(sd, (struct sockaddr*)&peer, &len);
		if (fd <= 0)
			break;
		inet_ntop(AF_INET6, &peer.sin6_addr, ip, len);
		printf("from %s : fd = %d\n", ip, fd);
	}


	close(sd);
	return 0;
}

客户端代码:


#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <linux/sockios.h>
#include <net/if.h>

int main(int argc, char *argv[])
{
	int sd;

	if (argc < 3)
	{
		printf("usage: %s  netdev  ipv6_addr \n", argv[0]);
		return 1;
	}

	sd = socket(AF_INET6, SOCK_STREAM, 0);
	if (sd < 0)
	{
		perror("socket");
		return 1;
	}
	
	struct ifreq req;
	strcpy(req.ifr_name, argv[1]);
	if (ioctl(sd, SIOCGIFINDEX, &req) < 0)
	{
		perror("gifindex");
		return 2;
	}

	struct sockaddr_in6 to = {AF_INET6, htons(10086), 0};
	inet_pton(AF_INET6, argv[2], &to.sin6_addr);	
	to.sin6_scope_id = req.ifr_ifindex;

	if (connect(sd, (struct sockaddr*)&to, sizeof(to)) < 0)
	{
		perror("connect");
		return 3;
	}

	close(sd);
	return 0;
}

udp测试例子, 接收端:



#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/sockios.h>
#include <sys/socket.h>
#include <net/if.h>

int main(void)
{
	int sd, ret;

	sd = socket(AF_INET6, SOCK_DGRAM, 0);
	if (sd < 0)
	{
		perror("socket");
		return 1;
	}

	struct sockaddr_in6  addr = {.sin6_family = AF_INET6,
		.sin6_port = htons(10086), .sin6_addr = IN6ADDR_ANY_INIT};
	if (bind(sd, (struct sockaddr*)&addr, sizeof(addr)) < 0)
	{
		perror("bind");
		return 1;
	}

	char data[100], ip[20];
	struct sockaddr_in6 peer;
	socklen_t len = sizeof(peer);
	while (1)
	{
		ret = recvfrom(sd, data, sizeof(data), 0, (struct sockaddr*)&peer, &len);
		if (ret <= 0)
			break;
		data[ret] = 0;
		inet_ntop(AF_INET6, &peer.sin6_addr, ip, len);
		printf("rcv from %s : %s\n", ip,  data);
	}

	close(sd);
	return 0;
}

发送端代码:



#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/sockios.h>
#include <sys/ioctl.h>
#include <net/if.h>


int main(void)
{
	int sd, i;

	sd = socket(AF_INET6, SOCK_DGRAM, 0);
	if (sd < 0)
	{
		perror("socket");
		return 1;
	}
	
	struct ifreq req;
	strcpy(req.ifr_name, "enp0s25");
	if (ioctl(sd, SIOCGIFINDEX, &req) < 0)
	{
		perror("gifindex");
		return 2;
	}

	struct sockaddr_in6  to;
	to.sin6_family = AF_INET6;
	to.sin6_port = htons(10086);
	to.sin6_scope_id = req.ifr_ifindex;
	
	if (inet_pton(AF_INET6, "fe80::20c:29ff:fe34:a9b4", &to.sin6_addr) <= 0)
	{
		perror("pton");
		return 2;
	}

	char data[100];
	for (i = 0; i < 10; i++)
	{
		sprintf(data, "ipv6 udp test %d\n", i);
		if (sendto(sd, data, strlen(data), 0, (struct sockaddr*)&to, sizeof(to)) < 0)
		{
			perror("sendto");
		}
	}

	close(sd);
	return 0;
}
Linux 系统编程 · 第 26 章:TCP/IP 基础与 Socket 编程 本章深入讲解Linux网络编程核心知识,涵盖TCP/IP协议栈原理、网络地址处理、Socket编程实现和服务器优化技术。主要内容包括:TCP/IP协议栈分层模型与三次握手/四次挥手过程;IPv4/IPv6地址转换与处理函数;完整TCP服务器/客户端实现流程;UDP编程特点;套接字选项调优方法;非阻塞I/O与多路复用高并发模型。通过代码示例演示地址转换、端口管理等基础操作,并对比分析不同服务器模型的性能特点,为构建高性能网络应用提供实践指导。 阅读详情

相关推荐

linux ipv6简单tcp/udp socket通信

linux下ipv6简单的tcp/udp socket通信,代码测试通过,具体可以参考: http://blog.youkuaiyun.com/zhengxianghdu/article/details/14106167

Linux IPv6 UDP套接字编程示例

下面是一个udp ipv6 demo, 包括创建ipv6套接字、绑定地址和发送数据等。 首先先在linux上配置一个本地站点地址,然后使用这个地址发送。 //linux上添加IPv6地址命令sudo ip -6 addr add fd11::100/64 dev eth0 /* * Description : IPv6 UDP套接字编程示例 * Author : mason * D...

weixin_41666796的博客 536

XCAT集群管理实战:从裸机到节点批量部署

在数据中心与HPC集群运维中,裸机配置与操作系统批量部署是关键环节。PXE引导、IPMI带外管理等基础技术为自动化装机提供了底层支持,而集群管理工具则将这些能力整合为可扩展的运维体系。XCAT作为一款开源集群管理工具,通过数据库驱动的方式统一管理DHCP、TFTP、HTTP等服务,实现从裸机发现、系统安装到电源控制的全流程自动化。本文从XCAT的核心设计出发,详细介绍了环境准备、安装配置、节点定义、镜像分发及常见问题排查,帮助运维人员快速构建高效的集群部署流程,降低规模化管理的复杂度。

weixin_30899023的博客 241

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的博客 1609

ISO26262功能安全--产品开发过程

目录 1.总体理解 2.概念阶段——吹牛,我们是打草稿的 2.1 相关项定义 2.2 HARA分析 2.3 功能安全目标 2.4 安全需求与安全概念 3. 系统阶段——闭门造神车,我们开始修炼 3.1 技术安全需求(TSC) 3.2 系统架构设计 3.3 安全分析与独立性分析 3.4 软硬件接口(HSI) 4. 硬件阶段——苦其心志,苦练经骨 4.1 硬件架构...

AgingMoon的博客 1万+

高效利用ChEMBL数据库:从靶点查询到活性数据处理的完整指南

本文提供了高效利用ChEMBL数据库的完整指南,从靶点查询到活性数据处理。详细介绍了靶点精准定位、高级过滤技巧、数据导出优化以及活性数据清洗、特征工程和可视化等实战技巧,帮助药物研发人员快速获取和处理生物活性数据,提升工作效率。

weixin_29278805的博客 792

linux配置ipv6环境,Linux下修改IPV6地址

如上图所示,eth0有IPV6地址。那如何修改它的IPV6地址,通过函数#include #include #include #include #include #include #include #include #include #include #include #include #if __GLIBC__ >=2 && __GLIBC_MINOR >= 1#in...

weixin_39631953的博客 1533

从《新程序员》系列看程序员职业发展趋势与成长路径

在信息技术日新月异的当下,软件开发行业蓬勃发展,程序员作为行业的核心力量,其成长与发展路径备受瞩目。《新程序员》系列杂志应运而生,以其前瞻性的视角、丰富多元的内容,为广大程序员尤其是新程序员提供了洞察行业趋势、学习前沿技术、汲取前辈经验的宝贵窗口。该系列杂志由优快云精心打造,自推出以来,便在开发者群体中引发了强烈反响。《新程序员》系列内容涵盖了从基础技术知识的深入解读,到行业前沿趋势的精准预测;从优秀开发者的成长历程分享,到各大企业数字化转型的实践案例剖析等多个维度。

AllenLV的博客 2255

Linux下IPV6通信

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

weixin_40407893的博客 6308

车辆动力学从入门到进阶之路(传统篇)

新手如何入门车辆动力学开发领域,本文为您引路!

CrazyRabbit的博客 1万+

微信小程序URL Link全解析:从生成原理到实战应用(附Java代码)

本文深入解析微信小程序URL Link的生成原理与实战应用。URL Link是微信官方提供的智能路由协议,通过中间页实现外部链接安全跳转至小程序指定页面。文章详细阐述了其权限模型、环境版本差异及跳转机制,并提供了包含令牌管理、异常处理和性能优化的健壮Java实现方案,助力开发者构建高可用的链接生成服务。

weixin_29327525的博客 1216

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

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

System Architect 4171

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

985小水博的摸鱼日常 3089

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

http://blogold.chinaunix.net/u1/48325/showart_413841.html http://blogold.chinaunix.net/u1/48325/showart_413841.html ·Linux网络编程基础

1241

第八届传智杯微信小程序开发挑战赛练习题库

本文是微信小程序开发练习题库,包含单选题、多选题和判断题三种题型。单选题主要考察小程序开发基础知识,如数组方法、组件使用、API调用等;多选题涵盖样式属性、页面跳转、数据处理等综合知识;判断题则测试开发者对小程序特性、生命周期、功能限制等概念的理解。题目内容涉及小程序开发的各个方面,包括组件使用、API调用、数据绑定、页面配置等核心知识点,适合开发者进行自我测试和知识巩固。

qq_73044452的博客 505

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

网络编程基础——从创建套接字到进行数据传输的各函数的参数详细解释

本文主要涉及 1. 网络编程的基础概念:IP地址,以及典型的两种通信方式TCP与UDP; 2. 网络编程从创建套接字到进行数据传输的各函数的参数详细解释

everything is possible,anything is OK. 1087

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

53.Linux socket编程

学习目标 ①熟悉计算机网络体系结构 ②掌握socket通信流程 ③了解网络编程相关知识 ④熟练使用socket编程接口实现网络通信 ⑤熟悉socket本地通信 Linux网络编程一般通过socket(套接字)接口实现,本章将以socket编程为主,结合计算机网络基础知识,讲解Linux系统中实现网络编程的方法。 1.1 计算机网络概述 计算机网络是网络的一种,网络由若干个结点和连接这些结点的链路组成,网络中的结点可以是计算机、交换机、路由器等。 为了...

m0_57908316的博客 2122

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Linux网络编程

端口的本质•定义:16位整数(0~65535),与IP地址共同组成套接字(Socket),唯一标识通信端点•示例:192.168.1.100:8080 表示IP为192.168.1.100的设备上运行在8080端口的应用端口的核心作用•服务标识:客户端通过端口号访问特定服务(如HTTP默认80端口)•并发支持:服务端通过不同端口同时处理多个请求。传输层的核心使命:功能定位•端到端通信:为不同主机上的应用进程提供逻辑通信(网络层负责主机到主机)•两大核心服务:•可靠传输(TCP)•高效传输(UDP)

2301_78153036的博客 215

网络编程期末复习

网络编程期末复习第一章 理解网络编程和套接字第二章第三章 地址族与数据序列第五章 基于TCP的服务器端/客户端第六章 基于UDP的服务器端/客户端第七章 优雅地断开套接字连接第九章 套接字的多种可选项第十章 多进程服务器端第十一章 进程间通信第十二章 I/O复用第十三章 多种I/O函数第十四章 多播与广播 第一章 理解网络编程和套接字 (1)套接字在网络编程中的作用是什么?为什么叫套接字? 答:网络编程就是编写程序使两台连网的计算机相互交换数据。在我们不需要考虑物理连接的情况下,我们只需要考录如何编写数据

qq_43717119的博客 3619

肝完这份Linux网络编程笔记,感觉2年开发白干了

随着Internet的快速发展,使用UNIX和Linux作为服务器主机的系统越来越多,而因为这种操作系统的稳定性和安全性,也使得基于UNIX和Linux的应用服务越来越多。掌握基于UNIX和Linux环境的编程技术,已成为相关网络管理人员、网络应用程序开发人员和网络安全保障人员的必备技能。 内容提要 本书详细介绍了在UNIX/Linux系统下基于TCP/P网络接口的基本编程方法,包括迭代与并发服务器编写方法、进程与线程编程技术、I/O 编程技术、IPv4与IPv6的兼容性、原始接口、数据链路访问技术、广

架构大数据双料架构师的博客 217

Linux网络 - Socket编程(IPv4&IPv6)

本文详细讲解了UDP和TCP协议的特性及编程实现。UDP是无连接、不可靠的协议,类似发送信封;TCP是有连接、可靠的协议,类似电话通话。文章介绍了socket编程接口,包括socket创建、bind绑定、sendto/recvfrom(UDP)和listen/accept/send/recv(TCP)等核心函数的使用方法。通过代码示例展示了UDP和TCP服务端/客户端的实现,并解释了IPv6兼容IPv4的方法。文章还讨论了网络字节序转换、缓冲区管理、黏包问题等关键技术点,为网络编程提供了实用指导。

2301_80772499的博客 1309

linux(八):Socket网络编程

Socket网络编程是Linux应用开发的核心技能之一,广泛应用于服务器、客户端通信及分布式系统中。本文基于《Linux平台应用开发教程V5》第13章内容,结合实战代码与关键概念解析,帮助读者掌握Socket编程的核心技术。主机字节序:CPU处理数据的顺序,分为大端序(高位在前)和小端序(低位在前)。网络字节序:TCP/IP协议规定使用大端序,确保跨平台数据一致性。 2. 套接字地址结构 2.1 通用结构体 socket 网络编程接口中表示 socket 地址的是结构体 sockaddr,这是所有地

weixin_72359141的博客 146

网络编程tcp

/创建套接字,返回对应的套接字文件描述符。//服务器地址 客户端地址。

jyd061114的博客 457
上一篇: C++笔试题
下一篇: 嵌入式软件工程师基础测试题
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值