windows socket ipv6 SOCK_RAW
bind处一直报错WSAEADDRNOTAVAIL10049,不知道为什么?
|
|
win10, vs2015
#include <stdio.h>
#include <winsock2.h>
#include <ws2ipdef.h> #pragma comment(lib, "ws2_32.lib") #define BUF_SIZE 30 int main()
{
int iResult = ;
WSADATA wsaData;
SOCKET sock;
char message[BUF_SIZE];
int strlen;
int addrsize; SOCKADDR_IN6 addrto, addrfrom; iResult = WSAStartup(MAKEWORD(, ), &wsaData); sock = socket(AF_INET6, SOCK_RAW, ); /*需要管理员权限*/
if (sock == INVALID_SOCKET)
printf("sock err = %d\n", WSAGetLastError()); addrto.sin6_family = AF_INET6;
addrto.sin6_addr.u.Byte[] = 0xfc;
addrto.sin6_addr.u.Byte[] = 0x00;
addrto.sin6_addr.u.Byte[] = 0x00;
addrto.sin6_addr.u.Byte[] = 0x00;
addrto.sin6_addr.u.Byte[] = 0x00;
addrto.sin6_addr.u.Byte[] = 0x00;
addrto.sin6_addr.u.Byte[] = 0x0d;
addrto.sin6_addr.u.Byte[] = 0x41;
addrto.sin6_addr.u.Byte[] = 0x00;
addrto.sin6_addr.u.Byte[] = 0x00;
addrto.sin6_addr.u.Byte[] = 0x00;
addrto.sin6_addr.u.Byte[] = 0x00;
addrto.sin6_addr.u.Byte[] = 0x0d;
addrto.sin6_addr.u.Byte[] = 0x41;
addrto.sin6_addr.u.Byte[] = 0x00;
addrto.sin6_addr.u.Byte[] = 0x02;
addrto.sin6_port = ; iResult = bind(sock, (SOCKADDR *)&addrto, sizeof(SOCKADDR_IN6));
if (iResult == SOCKET_ERROR)
printf("bind err = %d\n", WSAGetLastError()); while ()
{
addrsize = sizeof(addrfrom);
strlen = recvfrom(sock, message, BUF_SIZE, , (SOCKADDR*)&addrfrom, &addrsize);
} }
IPv4版本,需要保证本地连接已接通
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <winsock2.h>
#include <ws2ipdef.h>
#include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") #define BUF_SIZE 30
#define _WINSOCK_DEPRECATED_NO_WARNINGS int main()
{
int iResult = ;
WSADATA wsaData;
SOCKET sock;
char message[BUF_SIZE] = "send...";
int strlen;
int addrsize; SOCKADDR_IN addrto, addrfrom; iResult = WSAStartup(MAKEWORD(, ), &wsaData); sock = socket(AF_INET, SOCK_RAW, ); /*需要管理员权限*/
if (sock == INVALID_SOCKET)
printf("sock err = %d\n", WSAGetLastError()); addrfrom.sin_family = AF_INET;
addrfrom.sin_addr.S_un.S_addr = inet_addr("192.168.0.4");
addrfrom.sin_port = ; addrto.sin_family = AF_INET;
addrto.sin_addr.S_un.S_addr = inet_addr("192.168.0.5");
addrto.sin_port = ; iResult = bind(sock, (SOCKADDR *)&addrfrom, sizeof(addrfrom));
if (iResult == SOCKET_ERROR)
printf("bind err = %d\n", WSAGetLastError()); while ()
{
addrsize = sizeof(addrto);
strlen = sendto(sock, message, BUF_SIZE, , (SOCKADDR*)&addrto, addrsize);
} }
IPv6版本,2000::2可以通,addrfrom.sin6_scope_id = 0;地址范围设置是必须的,若为unicast地址可以设置为0。需要赋值,不然内存默认可能为cc。
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <winsock2.h>
#include <ws2ipdef.h>
#include <ws2tcpip.h>
#include <wsipv6ok.h> #pragma comment(lib, "ws2_32.lib") #define BUF_SIZE 30
#define _WINSOCK_DEPRECATED_NO_WARNINGS int main()
{
int iResult = ;
WSADATA wsaData;
SOCKET sock;
char message[BUF_SIZE] = "send...";
int strlen;
int addrsize;
SOCKADDR_IN6 addrto, addrfrom; iResult = WSAStartup(MAKEWORD(, ), &wsaData); sock = socket(AF_INET6, SOCK_RAW, ); /*需要管理员权限*/
if (sock == INVALID_SOCKET)
printf("sock err = %d\n", WSAGetLastError()); addrfrom.sin6_family = AF_INET6;
iResult = inet_pton(AF_INET6, "2000::2", addrfrom.sin6_addr.u.Byte);
addrfrom.sin6_port = htons();
addrfrom.sin6_scope_id = ; addrto.sin6_family = AF_INET6;
iResult = inet_pton(AF_INET6, "2000::1", addrto.sin6_addr.u.Byte);
addrto.sin6_port = htons();
addrto.sin6_scope_id = ; iResult = bind(sock, (SOCKADDR *)&addrfrom, sizeof(addrfrom));
if (iResult == SOCKET_ERROR)
printf("bind err = %d\n", WSAGetLastError()); while ()
{
addrsize = sizeof(addrto);
strlen = sendto(sock, message, BUF_SIZE, , (SOCKADDR*)&addrto, addrsize);
printf("sendto err = %d\n", WSAGetLastError());
} }
IPv6通,主要是scope_id
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <winsock2.h>
#include <ws2ipdef.h>
#include <ws2tcpip.h>
#include <wsipv6ok.h> #pragma comment(lib, "ws2_32.lib") #define BUF_SIZE 30
#define _WINSOCK_DEPRECATED_NO_WARNINGS int main()
{
int iResult = ;
WSADATA wsaData;
SOCKET sock;
char message[BUF_SIZE] = "send...";
int strlen;
int addrsize;
SOCKADDR_IN6 addrto, addrfrom; iResult = WSAStartup(MAKEWORD(, ), &wsaData); sock = socket(AF_INET6, SOCK_RAW, ); /*需要管理员权限*/
if (sock == INVALID_SOCKET)
printf("sock err = %d\n", WSAGetLastError()); addrfrom.sin6_family = AF_INET6;
iResult = inet_pton(AF_INET6, "fc00::d41:0:0:d41:2", addrfrom.sin6_addr.u.Byte);
addrfrom.sin6_port = htons();
addrfrom.sin6_scope_id = ; addrto.sin6_family = AF_INET6;
iResult = inet_pton(AF_INET6, "fc00::d41:0:0:d41:1", addrto.sin6_addr.u.Byte);
addrto.sin6_port = htons();
addrto.sin6_scope_id = ; iResult = bind(sock, (SOCKADDR *)&addrfrom, sizeof(addrfrom));
if (iResult == SOCKET_ERROR)
printf("bind err = %d\n", WSAGetLastError()); while ()
{
addrsize = sizeof(addrto);
strlen = sendto(sock, message, BUF_SIZE, , (SOCKADDR*)&addrto, addrsize);
printf("sendto err = %d\n", WSAGetLastError());
} }
windows10,vs2015,控制台C程序,使用socket TCP作为服务器,接收,接收数据。
一开始wireshark上都能看到SYN包了,但就是一直阻塞在accept上,原因是防火墙屏蔽了2020端口,把防火墙关闭之后就可以了。
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <winsock2.h>
#include <ws2ipdef.h>
#include <ws2tcpip.h>
#include <wsipv6ok.h> #pragma comment(lib, "ws2_32.lib") #define BUF_SIZE 4096
#define _WINSOCK_DEPRECATED_NO_WARNINGS int main()
{
int iResult = ;
WSADATA wsaData;
SOCKET sock;
char message[BUF_SIZE] = "send...";
int strlen;
int addrsize;
SOCKADDR_IN6 addrBOARD, addrPC; iResult = WSAStartup(MAKEWORD(, ), &wsaData); sock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); /*需要管理员权限*/
if (sock == INVALID_SOCKET)
printf("sock err = %d\n", WSAGetLastError()); addrPC.sin6_family = AF_INET6;
iResult = inet_pton(AF_INET6, "fc00:0:0:d401::1", addrPC.sin6_addr.u.Byte);
addrPC.sin6_port = htons();
addrPC.sin6_scope_id = ; iResult = bind(sock, (SOCKADDR *)&addrPC, sizeof(addrPC));
if (iResult == SOCKET_ERROR)
printf("bind err = %d\n", WSAGetLastError()); iResult = listen(sock, );
if (iResult == SOCKET_ERROR)
printf("listen err = %d\n", WSAGetLastError()); while ()
{
SOCKET sockConnection; addrsize = sizeof(addrBOARD);
sockConnection = accept(sock, (SOCKADDR *)&addrBOARD, &addrsize);
if (sockConnection == INVALID_SOCKET)
printf("sock accept err = %d\n", WSAGetLastError()); recv(sockConnection, message, BUF_SIZE, ); } }
windows socket ipv6 SOCK_RAW的更多相关文章
- windows socket函数详解
windows socket函数详解 近期一直用第三方库写网络编程,反倒是遗忘了网络编程最底层的知识.因而产生了整理Winsock函数库的想法.以下知识点均来源于MSDN,本人只做翻译工作.虽然很多前 ...
- linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解
最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...
- 转:Windows Socket五种I/O模型
原文转自: Windows Socket五种I/O模型 Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模 ...
- Windows Socket五种I/O模型——代码全攻略(转)
Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模式.可以通过多线程技术进行处理. 非阻塞模式:执行I/O操 ...
- Windows Socket知识总结
目录 0 理解Socket 1 WinSock API 2 阻塞socket 3 非阻塞Socket 4 套接字IO模型 4.1 套接字IO模型:select(选择) 4.2 套接字IO模型:W ...
- 高性能 Windows Socket 组件 HP-Socket v3.0.2 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- 高性能 Windows Socket 组件 HP-Socket v3.0.1 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- 高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-2 发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- 高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-1 发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
随机推荐
- Scala实践8
1.1继承类 使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法. class Person { var name = "zhangsan" ...
- 【一起学源码-微服务】Hystrix 源码二:Hystrix核心流程:Hystix非降级逻辑流程梳理
说明 原创不易,如若转载 请标明来源! 欢迎关注本人微信公众号:壹枝花算不算浪漫 更多内容也可查看本人博客:一枝花算不算浪漫 前言 前情回顾 上一讲我们讲了配置了feign.hystrix.enabl ...
- 七牛云上传视频并截取第一帧为图片(js实现)
本文出自APICloud官方论坛, 感谢论坛版主 东冥羽的分享. 七牛云上传视频并截取第一帧作为视频的封面图. 使用js上传,模块videoPlayer截取第一帧(有专门的截图模块,但是我使用的有点问 ...
- Graph Transformer Networks 论文分享
论文地址:https://arxiv.org/abs/1911.06455 实现代码地址:https://github.com/ seongjunyun/Graph_Transformer_Netwo ...
- oracle的一些简单语法
1.创建主键自增: --创建序列 create sequence seq_tb_user minvalue nomaxvalue start with increment by nocycle --一 ...
- kaggle竞赛分享:NFL大数据碗(上篇)
kaggle竞赛分享:NFL大数据碗 - 上 竞赛简介 一年一度的NFL大数据碗,今年的预测目标是通过两队球员的静态数据,预测该次进攻推进的码数,并转换为该概率分布: 竞赛链接 https://www ...
- 7.JavaSE之类型转换
类型转换: 由于Java是强类型语言,所以要进行运算的时候,需要用到类型转换. 图中优先级从低到高,小数优先级大于整数. 运算中,不同类型的数据需要转换为同一类型,然后进行运算. 强制类型转换:(类型 ...
- 机器学习-K最近邻算法
一.介绍 二.编程 练习一(K最近邻算法在单分类任务的应用): import numpy as np #导入科学计算包import matplotlib.pyplot as plt #导入画图工具fr ...
- git recommend(alive)
初始化并跟踪远程分支: echo "# test" >> README.mdgit initgit add README.mdgit commit -m "f ...
- Java中的循环语句
1.1 while 循环语句 while 语句也称为条件判断语句. 循环方式 : 利用一个条件来控制是否要反复执行这个语句. 语法 : while(条件表达式){ 执行语句 } 当条件表达式的返回值为 ...