windows socket ipv6 SOCK_RAW

windows socket ipv6 SOCK_RAW

bind处一直报错WSAEADDRNOTAVAIL10049,不知道为什么?

WSAEADDRNOTAVAIL 10049
Cannot assign requested address.

The requested address is not valid in its context. This normally results from an attempt to
bind to an address that is not valid for the local computer. This can also result from
connect,
sendto,
WSAConnect,
WSAJoinLeaf, or
WSASendTo when the remote address or port is not valid for a remote computer (for example, address or port 0).

 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 = 0;
    WSADATA wsaData;
    SOCKET sock;
    char message[BUF_SIZE];
    int strlen;
    int addrsize;

    SOCKADDR_IN6 addrto, addrfrom;

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

    sock = socket(AF_INET6, SOCK_RAW, 89);    /*需要管理员权限*/
    if (sock == INVALID_SOCKET)
        printf("sock err = %d\n", WSAGetLastError());

    addrto.sin6_family = AF_INET6;
    addrto.sin6_addr.u.Byte[0] = 0xfc; 
    addrto.sin6_addr.u.Byte[1] = 0x00;
    addrto.sin6_addr.u.Byte[2] = 0x00;
    addrto.sin6_addr.u.Byte[3] = 0x00;
    addrto.sin6_addr.u.Byte[4] = 0x00;
    addrto.sin6_addr.u.Byte[5] = 0x00;
    addrto.sin6_addr.u.Byte[6] = 0x0d;
    addrto.sin6_addr.u.Byte[7] = 0x41;
    addrto.sin6_addr.u.Byte[8] = 0x00;
    addrto.sin6_addr.u.Byte[9] = 0x00;
    addrto.sin6_addr.u.Byte[10] = 0x00;
    addrto.sin6_addr.u.Byte[11] = 0x00;
    addrto.sin6_addr.u.Byte[12] = 0x0d;
    addrto.sin6_addr.u.Byte[13] = 0x41;
    addrto.sin6_addr.u.Byte[14] = 0x00;
    addrto.sin6_addr.u.Byte[15] = 0x02;
    addrto.sin6_port = 89;

    iResult = bind(sock, (SOCKADDR *)&addrto, sizeof(SOCKADDR_IN6));
    if (iResult == SOCKET_ERROR)
        printf("bind err = %d\n", WSAGetLastError());

    while (1)
    {
        addrsize = sizeof(addrfrom);
        strlen = recvfrom(sock, message, BUF_SIZE, 0, (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 = 0;
    WSADATA wsaData;
    SOCKET sock;
    char message[BUF_SIZE] = "send...";
    int strlen;
    int addrsize;

    SOCKADDR_IN addrto, addrfrom;

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

    sock = socket(AF_INET, SOCK_RAW, 89);    /*需要管理员权限*/
    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 = 89;

    addrto.sin_family = AF_INET;
    addrto.sin_addr.S_un.S_addr = inet_addr("192.168.0.5");
    addrto.sin_port = 89;

    iResult = bind(sock, (SOCKADDR *)&addrfrom, sizeof(addrfrom));
    if (iResult == SOCKET_ERROR)
        printf("bind err = %d\n", WSAGetLastError());

    while (1)
    {
        addrsize = sizeof(addrto);
        strlen = sendto(sock, message, BUF_SIZE, 0, (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 = 0;
    WSADATA wsaData;
    SOCKET sock;
    char message[BUF_SIZE] = "send...";
    int strlen;
    int addrsize;
    SOCKADDR_IN6 addrto, addrfrom;

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

    sock = socket(AF_INET6, SOCK_RAW, 89);    /*需要管理员权限*/
    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(89);
    addrfrom.sin6_scope_id = 0;

    addrto.sin6_family = AF_INET6;
    iResult = inet_pton(AF_INET6, "2000::1", addrto.sin6_addr.u.Byte);
    addrto.sin6_port = htons(89);
    addrto.sin6_scope_id = 0;

    iResult = bind(sock, (SOCKADDR *)&addrfrom, sizeof(addrfrom));
    if (iResult == SOCKET_ERROR)
        printf("bind err = %d\n", WSAGetLastError());

    while (1)
    {
        addrsize = sizeof(addrto);
        strlen = sendto(sock, message, BUF_SIZE, 0, (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 = 0;
    WSADATA wsaData;
    SOCKET sock;
    char message[BUF_SIZE] = "send...";
    int strlen;
    int addrsize;
    SOCKADDR_IN6 addrto, addrfrom;

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

    sock = socket(AF_INET6, SOCK_RAW, 89);    /*需要管理员权限*/
    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(89);
    addrfrom.sin6_scope_id = 0;

    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(89);
    addrto.sin6_scope_id = 0;

    iResult = bind(sock, (SOCKADDR *)&addrfrom, sizeof(addrfrom));
    if (iResult == SOCKET_ERROR)
        printf("bind err = %d\n", WSAGetLastError());

    while (1)
    {
        addrsize = sizeof(addrto);
        strlen = sendto(sock, message, BUF_SIZE, 0, (SOCKADDR*)&addrto, addrsize);
        printf("sendto err = %d\n", WSAGetLastError());
    }

}

 

 

转载于:https://www.cnblogs.com/yanhc/p/10306304.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101158.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux(4)Linux 文件内容查看「建议收藏」

    linux(4)Linux 文件内容查看「建议收藏」查看文件内容总览cat由第一行开始显示文件内容tac从最后一行开始显示,可以看出tac是cat的倒着写!nl显示的时候,顺道输出行号!more一页一页的显示文件内容less

  • 实时数据库与时序数据库区别_时间序列数据库

    实时数据库与时序数据库区别_时间序列数据库1、概述在工业大数据数据库存储领域,除了传统的关系型数据库和分布式数据库以外,还有一种类型的数据库是非常常用,而且是非常有必要的,就是实时数据库,以及时序数据库。但是,大家可能会有疑问,都是专门处理时序数据的,这是两种数据库吗?他们之间有什么联系?1.1发展历史实时数据库是数据库系统的一个分支,它适用于处理不断更新的快速变化的数据及具有时间限制的事务处理。实时数据库技术是实时系统和数据库技术相结合的产物。实时数据库最起初是基于先进控制和优化控制而出现的,对数据的实时性要求比较高,因而实时、高效

  • vector>初始化_电脑初始化出现问题

    vector>初始化_电脑初始化出现问题1、默认初始化,vector为空,size为0,未开辟空间,可通过push_back()添加元素。vector&lt;int&gt;v;v.push_back(10);2、默认初始化,指定vector大小,元素初始值默认为0,元素增多时,同样可以通过push_back()来改变vector大小以增加元素。vector&lt;int&gt;v(5)3、指定初始化元素值为2…

  • 软考之网络基础

    软考之网络基础

    2021年11月29日
  • STM32F4(用SysTick实现Delay函数)[通俗易懂]

    STM32F4(用SysTick实现Delay函数)[通俗易懂]STM32F4(用SysTick实现Delay函数)1,开发环境     1,适用芯片:STM32F4全部芯片    2,固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0     3,IDE:MDK5172,驱动源码     Delay.h文件/**************************************

  • Java基准测试工具JMH详解

    Java基准测试工具JMH详解Java基准测试工具JMH详解1.JMH简介1.1JMH概念1.2JMH与JMeter区别1.3JMH注解说明2.JMH使用2.1创建项目2.2引入依赖2.3启动异常解决2.4JMH案例11.JMH简介1.1JMH概念JMHisaJavaharnessforbuilding,running,andanalysingnano/micro/milli/macrobenchmarkswritteninJavaandotherlanguagestargett

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号