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 ...
随机推荐
- 题解 LA3720
题目大意 多组数据,每组数据给定两个整数 \(n,m\),请求出 \(n\times m\) 的点阵(即 \((n-1)\times(m-1)\) 的方格)中有多少条非水平竖直的经过至少两个格点的不同 ...
- 艾编程coding老师:深入JVM底层原理与性能调优
1. Java内存模型JMM,内存泄漏及解决方法:2. JVM内存划分:New.Tenured.Perm:3. 垃圾回收算法:Serial算法.并行算法.并发算法:4. JVM性能调优,CPU负载不足 ...
- python爬虫——requests库使用代理
在看这篇文章之前,需要大家掌握的知识技能: python基础 html基础 http状态码 让我们看看这篇文章中有哪些知识点: get方法 post方法 header参数,模拟用户 data参数,提交 ...
- java 方法定义 调用
一.定义 格式: 修饰符 返回值类型 方法名(参数){ return } 相比之下python方法的定义简单多了 public static 是修饰符 二.调用 方法名(); 注意:要在main方法中 ...
- Linux安装python和更新pip
一.安装python 1.安装依赖包 1).安装gcc 通过gcc --version 查看,若没有则安装gcc yum -y install gcc 2).安装其他依赖包 yum -y instal ...
- PHP——常量
一.什么是常量 常量可以理解为值不变的量(如圆周率)或者是常量值被定义后,在脚本的其他任何地方都不可以被改变.PHP中的常量分为自定义常量和系统常量,自定义常量是根据我们开发的需要,而定义的常量,它通 ...
- 【java面试】Web篇
1.AJAX创建步骤 step1. 创建XMLHttpRequest对象,也就是创建一个异步调用对象: step2. 创建一个新的HTTP请求,并指定改HTTP请求的方法.URL以及验证信息: s ...
- java自定义注解学习(注解处理器)
如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...
- Linux上部署web服务器并发布web项目
近在学习如何在linux上搭建web服务器来发布web项目,由于本人是linux新手,所以中间入了不少坑,搞了好久才搞出点成果.以下是具体的详细步骤以及我对此做的一些总结和个人的一些见解,希望对跟我一 ...
- airtest启用本地python环境的方法
实现目标,air如果想引用第三方python库,则需要在本地python欢迎执行运行 1.打开设置,红色箭头处,选择本地python路径 2.安装air的两个核心库airtest和pocoui 安装方 ...