一 服务器端

#include <winsock2.h>

#include <ws2tcpip.h>

#include <iostream.h>

#include "tpipv6.h"

// 所需库连接

#pragma comment (lib,"Ws2_32.lib")

void main()

{

WSADATA wsaData;  //版本协商

if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)

{

cout<<"装载socket失败!"<<endl;

return ;

}

SOCKET server_sock, client_sock;  //服务器端和客户端套接字

//addrinfo结构体是为了消除IPv6协议与IPv4协议之间的差异,编制统一的程序而追加的结构。并且允许多个IPv4地址或IPv6地址链成链表

struct addrinfo server_addr , //服务器端地址信息

*res=NULL; //若有多个地址,res是地址信息链表指针

memset(&server_addr,0,sizeof(server_addr));//如果没有这句话就会出现绑定错误,也就是在调用getaddrinfo()之前该参数必须清0

server_addr.ai_family = AF_INET6;  //地址簇,这里指定是ipv6协议,其值可以是 AF_INET:ipv4, AF_INET6:ipv6

server_addr.ai_socktype = SOCK_STREAM;  //套接字类型,这里是流式,其值可以是 SOCK_STREAM:流式, SOCK_DGRAM:数据报, SOCK_RAW:原始套接字

server_addr.ai_protocol = IPPROTO_TCP;  //传输层协议,这里是TCP协议,其值可以是: IPPROTO_TCP:TCP, IPPROTO_UDP:UDP, 若为0系统根据套接字类型自动选择

int result;

result = getaddrinfo("3ffe:3600:21:3000::1", "2000", &server_addr, &res); //解析本机地址, 服务器地址 监听端口

if(result != 0)//地址解析正确时返回0

{

cout<<"服务器地址解析错误!"<<endl;

return ;

}

server_sock = socket(res->ai_family,res->ai_socktype,res->ai_protocol); //创建服务器端socket

if(server_sock == INVALID_SOCKET)

{

cout<<"创建服务器socket失败!"<<endl;

return ;

}

if(bind(server_sock, res->ai_addr, res->ai_addrlen) == SOCKET_ERROR)  //绑定

{

cout<<"服务器端绑定失败!"<<endl;

return ;

}

if( listen(server_sock ,2) == SOCKET_ERROR )  //监听

{

cout<<"服务器端监听失败!"<<endl;

return;

}

//  struct sockaddr_in6 client_addr; //客户端地址

struct sockaddr_storage client_addr; //结构体sockaddr_storage有足够大的空间来存储任何类型的sockaddr

int clientaddr_len = sizeof(client_addr);  //客户端地址长度

while(1)

{

client_sock = accept(server_sock,(struct sockaddr*)&client_addr,&clientaddr_len);//接受客户端连接

if(client_sock == INVALID_SOCKET)

{

cout<<"接受客户端连接失败!"<<endl;

continue;   //继续

}

//  cout<<"连接来自:"<<inet_pton(client_addr.sin6_addr)<<endl;

char buf[256];//发送和接收缓冲区

int nRecv=0;

while(1)

{

cout<<"服务器端请输入:";

cin>>buf;

send(client_sock,buf,256,0);

nRecv = recv(client_sock,buf,256,0);

if(nRecv>0)

{

buf[nRecv]='/0';

cout<<"服务器收到:"<<buf<<endl;

}

}

}

closesocket(server_sock);//关闭服务器端套接字

closesocket(client_sock);//关闭客户端套接字

}

二 客户端

#include <winsock2.h>

#include <ws2tcpip.h>

#include <iostream.h>

#include "tpipv6.h"

// 所需库连接

#pragma comment (lib,"Ws2_32.lib")

void main()

{

WSADATA wsaData;

if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)

{

cout<<"装载socket失败!"<<endl;

return ;

}

SOCKET client_sock;  //客户端本地套接字

struct addrinfo server_addr, *addrinfo=NULL; //服务器端地址

memset(&server_addr,0,sizeof(server_addr));//在getaddrinfo()之前必须清0

server_addr.ai_family = AF_INET6;  //指定是ipv6协议

server_addr.ai_socktype = SOCK_STREAM; //流式

server_addr.ai_protocol = IPPROTO_TCP;  //TCP协议,也可以是0,让系统自己选

int result;

result = getaddrinfo("3ffe:3600:21:3000::1","2000",&server_addr,&addrinfo);  //服务器端ipv6地址, 服务器监听的端口

if(result !=0)//地址解析正确时返回0

{

cout<<"客户端解析服务器地址失败!"<<endl;

return;

}

client_sock = socket(addrinfo->ai_family,addrinfo->ai_socktype,addrinfo->ai_protocol); //创建客户端套接字

if(client_sock == INVALID_SOCKET)

{

cout<<"创建客户端socket失败!"<<endl;

return;

}

if( connect(client_sock,addrinfo->ai_addr,addrinfo->ai_addrlen) == SOCKET_ERROR)  //连接服务器

{

cout<<"连接服务器出错!"<<endl;

return;

}

char buf[256];  //发送和接收缓冲区

int nRecv=0;

while(1)

{

nRecv=recv(client_sock,buf,256,0);

if(nRecv>0)

{

buf[nRecv]='/0';

cout<<"客户端收到:"<<buf<<endl;

}

cout<<"客户端请输入:";

cin>>buf;

send(client_sock,buf,256,0);

}

closesocket(client_sock); //关闭客户端套接字

}

转载于:https://www.cnblogs.com/javaexam2/archive/2010/07/09/2632987.html

基于ipv6的socket通信(TCP)相关推荐

  1. IPv6之初使用,及IPv4与IPv6的socket通信

    1.IPv6概念 IPv6是InternetProtocol Version 6的缩写.IPv6是IETF(互联网工程任务组,InternetEngineering Task Force)设计的用于替 ...

  2. 基于C/C++socket通信的后台木马程序

    #基于C/C++socket通信的后台木马程序 ##什么是socket通信? 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口 ...

  3. php udp发送和接收_php socket通信(tcp/udp)实例分析

    本文实例讲述了php socket通信(tcp/udp)方法.分享给大家供大家参考,具体如下: 注意 1.在socket_bind的时候ip地址不能真回环地址如127.0.0.1 2.server.p ...

  4. 递归锁、信号量、GIL锁、基于多线程的socket通信和进程池线程池

    递归锁.信号量.GIL锁.基于多线程的socket通信和进程池线程池 递归锁 死锁现象:是指两个或两个以上的进程和线程因抢夺计算机资源而产生的一种互相等待的现象 from threading impo ...

  5. recv原理、高阶版黏包解决方案、基于UDP的socket通信

    recv原理.高阶版黏包解决方案.基于UDP的socket通信 recv原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自soc ...

  6. 基于Java的Socket实现TCP连接

    资源下载地址:https://download.csdn.net/download/sheziqiong/86159198 资源下载地址:https://download.csdn.net/downl ...

  7. socket通信 tcp协议和udp协议 C++

    Socket通信学习(套字接) Socket通信主要分两种:TCP协议和UDP协议 TCP:Transmission Control Protocol UDP:User Datagram Protoc ...

  8. Android基于局域网的socket通信

    最近写了一个关于局域网socket通信的demo,代码和ui都很low,但是功能实现了,所以贴出来记录一下 主要流程如下 服务端:启动服务-->显示ip-->等待接收-->显示消息- ...

  9. linux socket通信tcp,基于TCP协议的socket通信

    一.服务器端 1.创建serverSocket,即服务器端的socket,绑定指定的端口,并侦听此端口 ServerSocket server = new ServerSocket(8888); 2. ...

  10. ROS之socket通信---TCP/UDP

    1.UDP通信: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <s ...

最新文章

  1. 转录组的技术应用 (生物学、医学、农学中的应用)
  2. 串联NSOperation知识点
  3. pytorch报错Unable to get repr for
  4. 124第七章—逻辑卷简介及在图形界面进行管理配置
  5. 被AI人机疯狂单杀?王者荣耀AI“绝悟”亲测体验
  6. 第29届IEEE IV 征稿启示
  7. 第65课 采访报道 《小学生C++趣味编程》
  8. ImageMagick 拆分透明PNG 合并JPG和Alpha Mask
  9. 微软征询“Xbox支付方式”,选项包括比特币支付
  10. 成员变量与局部变量的区别
  11. 峰Redis学习(6)Redis 数据结构(sorted-set的操作)
  12. 谷歌再次修复已遭利用的两枚高危0day (CVE-2020-16009/16010)
  13. Enterprise Library:Unity的几个注意事项
  14. 浏览器自动转换URL编码产生乱码问题
  15. 最长回文子串(Longest Palindromic Substring)-DP问题
  16. 小米路由器R1D改造记录-安装MIXBOX
  17. python网管系统_Python学员作品-网吧管理系统
  18. 什么是CTI?呼叫中心系统CTI技术的应用
  19. 【汇智学堂】-JS菜鸟版手机小游戏(五子棋游戏之一---准确落下棋子)
  20. 过滤三角网算法求取凹包(二)

热门文章

  1. loadrunner 一个诡异问题
  2. 聊聊 Java 中 HashMap 初始化的另一种方式
  3. 在vs2010中mfc,C++的一些小经验
  4. 部署Vista(7)——创建一个最基本的应答文件
  5. java 文件下载 并发_高并发下载tomcat下的文件时,发生java.net.SocketException: Connection reset解决方案...
  6. 19.MongoDB值distinct性能验证
  7. java子字符串个数组_javasript 字符串 数组操作
  8. class type
  9. python面值组合_算法题 - 拼凑面额 - Python
  10. IDEA创建maven聚合项目多模块项目并在Tomcat启动图解详细教程