IPV6 Socket编程
IPV6 socket的练习程序,服务器打印客户端的地址,然后回送收到的消息。
server_v6.c
/************************************************************ Copyright (C), 2017, Leon, All Rights Reserved. FileName: server_v6.c Description: IPV6网络编程练习 Author: Leon Version: 1.0 Date: 2017-2-9 11:09:39 Function: History: <author> <time> <version> <description> Leon ************************************************************/#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h>#define BUF_LEN 2048 #define PORT 10023int main(int argc, char *argv[]) {int serv_sock = -1, client_sock = -1;socklen_t addr_len = 0;struct sockaddr_in6 local_addr = {0}, client_addr = {0};char buf[BUF_LEN] = {0};int err = -1;/* 建立socket */serv_sock = socket(PF_INET6, SOCK_STREAM, 0);if(-1 == serv_sock){perror("socket error: ");return -1;}/* 填充地址结构 */local_addr.sin6_family = AF_INET6;local_addr.sin6_port = htons(PORT);local_addr.sin6_addr = in6addr_any;/* 绑定地址 */err = bind(serv_sock, (struct sockaddr *)&local_addr, sizeof(struct sockaddr_in6));if(-1 == err){perror("bind error: ");close(serv_sock);return -1;}/* 监听 */err = listen(serv_sock, 5);if(-1 == err){perror("listen error: ");close(serv_sock);return -1;}/* 循环等待客户连接请求 */while(1){memset(&client_addr, 0x0, sizeof(client_addr));addr_len = sizeof(struct sockaddr_in6);client_sock = accept(serv_sock, (struct sockaddr *)&client_addr, &addr_len);if(-1 == client_sock){perror("accept error:");close(serv_sock);return -1;}/* 转换client地址为字符串并打印 */inet_ntop(AF_INET6, &client_addr.sin6_addr, buf, BUF_LEN);printf("A clinet connected, ip: %s, port %d\n", buf, ntohs(client_addr.sin6_port));/* 接收消息 */memset(buf, 0x0, BUF_LEN);err = recv(client_sock, buf, BUF_LEN, 0);if(err < 0){perror("recv error:");close(serv_sock);close(client_sock);return -1;}printf("recv %d bytes: %s\n", err, buf);/* 回送消息 */err = send(client_sock, buf, strlen(buf), 0);if(err < 0){perror("send error:");close(serv_sock);close(client_sock);return -1;}/* 关闭这个client连接 */close(client_sock);}return 0; }
client_v6.c
/************************************************************ Copyright (C), 2017, Leon, All Rights Reserved. FileName: client_v6.c Description: IPV6网络编程练习 Author: Leon Version: 1.0 Date: 2017-2-9 11:09:39 Function: History: <author> <time> <version> <description> Leon ************************************************************/// connect时地址长度填错,一直报这个错 connect error:: Invalid argument#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h>#define BUF_LEN 2048 #define PORT 10023int main(int argc, char *argv[]) {int sock = -1;socklen_t addr_len = 0;struct sockaddr_in6 serv_addr = {0};char buf[BUF_LEN] = {0};int err = -1;/* 建立socket */sock = socket(AF_INET6, SOCK_STREAM, 0);if(-1 == sock){perror("socket error: ");return -1;}memset(&serv_addr, 0x0, sizeof(serv_addr));/* 填充地址结构 */serv_addr.sin6_family = AF_INET6;serv_addr.sin6_port = htons(PORT);serv_addr.sin6_addr = in6addr_loopback; /* 连接到环回地址 */// 不能connect到链路本地地址// inet_pton(AF_INET6, "fe80::20c:29ff:fe8f:c168", &serv_addr.sin6_addr);addr_len = sizeof(serv_addr);err = connect(sock, (struct sockaddr *)&serv_addr, addr_len);if(-1 == err){perror("connect error:");close(sock);return -1;}/* 发送消息 */memset(buf, 0x0, BUF_LEN);snprintf(buf, BUF_LEN - 1, "hello server, I'm client\n");err = send(sock, buf, strlen(buf), 0);if(err < 0){perror("send error:");close(sock);return -1;}/* 接收消息 */memset(buf, 0x0, BUF_LEN);err = recv(sock, buf, BUF_LEN, 0);if(err < 0){perror("recv error:");close(sock);return -1;}printf("recv %d bytes: %s\n", err, buf);close(sock);return 0; }
运行结果
root@ubuntu:ipv6_socket# ./server_v6
A clinet connected, ip: ::1, port 56358
recv 25 bytes: hello server, I'm client
A clinet connected, ip: ::ffff:192.168.242.1, port 11111
recv 12 bytes: 123456478764
第一个客户端为上面程序实现的客户端,connect的本地环回地址。第二个客户端为一个IPV4的客户端,connect的192.168.242.2的地址。可以看到对于支持双栈的IPV6服务器,一样可以接受IPV4客户端的连接和通信,IPV4客户端打印出来的地址为IPV4映射的IPV6地址,这些都由协议栈处理好了。附一张图:
注意点
- 客户端connect时不能连接到链路本地地址(fe80开头那个地址),否则会报
connect error:: Invalid argument
的错误,可以connect环回地址,或者用命令ip addr add 2001::1/64 dev eth0
为接口添加一个IPV6地址。connect的地址长度入参错了,也会报这个错
IPV6 Socket编程相关推荐
- ipv6 socket
LINUX 下 ipv6 socket 编程 发布: 2009-7-11 10:57 | 作者: admin | 来源: IPv6之家 大家都知道,随着互联网上主机数量的增多,现有的32位IP地址已经 ...
- (转)网络编程:Socket编程从IPv4转向IPv6支持
目前运行主流的IT系统中,用于解决分布式系统内部模块及不同的系统间通信的一种主要的解决方案就是使用套接字Socket来开发应用.由于当前大部分正在运行的IT系统中使用套接字Socket开发环境基本上都 ...
- ipv6 socket python网络编程
ipv6 socket 常用方法 通过地址建立socket: 设置ttl/hop: 地址复用: 绑定: 加入多播组(向操作系统订阅多播消息) 指定多播发送的接口: 参考示例 ipv6组播监听 常用方法 ...
- python 图形化socket编程_Python黑帽编程2.8 套接字编程
Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...
- python基础之socket编程
阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 ...
- Go中的Socket编程
在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程.你想过这些情景么?我们每天打开浏览器浏览网页时,浏览器进程怎么和W ...
- VII Python(9)socket编程
VII Python(9)socket编程 socket编程: 网络基础: TCP/IP: socket模型: python socket C/S开发: 非阻塞(select.poll.epoll) ...
- Socket编程之简单介绍
一:套接字编程相关知识点 Socket概念:套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机进行,也可以跨网络进行. 网络中的进程是通过socket来通信的.socket ...
- socket编程方法,概念
"蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也.蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也." ------------------------------------- ...
最新文章
- sklearn可视化不同数据划分方法的差异:KFold, ShuffleSplit,StratifiedKFold, GroupKFold, StratifiedShuffleSplit.......
- GCT之数学公式(三角函数)
- N76E003---看门狗
- linux内核分为四个子系统,linux操作系统的内核有哪几个子系统构成,简要说明各子系统的作用...
- POJ 2185 Milking Grid (KMP,GCD)
- XE Styles不见了
- 对话阿里云李飞飞:数据库迎来开源新时代 | 《新程序员》
- opengl画的弧线 为什么有一个半径_6个1画生日蛋糕,也太简单啦【图文+视频教程】...
- 【特征提取】基于matlab语音端点检测【含Matlab源码 552期】
- api 文件长度_上传下载API
- VS2010 下载与安装
- php在线拍照代码,html5可以实现在线拍照了
- Revit二次开发——布管系统设置
- windows7内部版本7601副本不是正版的解决方案
- Nodemailer 使用Gmail发送邮件
- Excel文件加密后忘记密码破解方法
- 机器学习和人工智能的关系
- C++-win32-GetLastError的返回值的含义
- MySQL8.0 通过data文件和SQL语句恢复数据库
- (每日一练c语言)写入字符串到文件txt
热门文章
- oracle label security redition,今天在用11GR2客户端全库导出10GR2版本的数据库时报ORA-00904错误...
- centos7 sh 注释_在CentOS7上安装RocketMQ 4.7.1
- python的命名空间_python命名空间(namespace)
- scilab和matlab的区别,matlab 与scilab的比较.doc
- 使用函数统计指定数字的个数_四种函数方法实现按条件统计一个区间数字的个数...
- React+TypeScript+webpack4多入口项目搭建
- HIT Software Construction Review Notes(1-1 Multi-Dimensional Views of Software Construction)
- html中h标签可包含a标签,HTML中H标签P标签(Paragraph)img标签(image)a标签(anchor)
- 安卓Android资源链接失败,Android资源链接失败
- 公司来的新同事能力没我强,但是工资比我高,我应该提出加薪还是选择辞职?