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

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

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

(0)
上一篇 2021年6月28日 下午10:00
下一篇 2021年6月29日 上午8:00


相关推荐

  • IIS与Apache同时使用80端口

    IIS与Apache同时使用80端口

    2021年10月8日
    44
  • css transition动画_css3过渡属性有几种

    css transition动画_css3过渡属性有几种css动画效果之transition(动画效果属性)

    2022年4月21日
    52
  • 数独检查

    数独检查数独检查题目来源 acwing 题库题目地址 https www acwing com problem content 705 题目描述 数独是一种流行的单人游戏 目标是用数字填充 9×9 矩阵 使每列 每行和所有 9 个非重叠的 3×3 子矩阵包含从 1 到 9 的所有数字 每个 9×9 矩阵在游戏开始时都会有部分数字已经给出 通常有一个独特的解决方案 给定完成的 N2 N2 数独矩阵 你的任务是确定它是否是有效的解决方案 有效的解决方案必须满足以下条件 每行包含从 1 到 N2 的每个数字 每个数字一次 每列包含

    2026年3月17日
    2
  • 快慢指针

    快慢指针最近开始做一些 oj 题目才发现有快慢指针这种好东西 然而每次见的题目并不能完全掌握 所以在这里做一下整理 nbsp 一 快慢指针概念 nbsp nbsp nbsp nbsp 快慢指针中的快慢指的是移动的步长 即每次向前移动速度的快慢 例如可以让快指针每次沿链表向前移动 2 慢指针每次向前移动 1 次 二 应用 nbsp nbsp nbsp 2 1 nbsp 判断单链表是否为循环链表 nbsp nbsp nbsp nbsp 对于初学者来说 要解决这个问题 最

    2026年3月20日
    2
  • update 数据。表之间关联 赋值

    update 数据。表之间关联 赋值

    2022年3月7日
    40
  • 扣子智能体如何打开或关闭深度思考

    扣子智能体如何打开或关闭深度思考

    2026年3月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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