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 ...
随机推荐
- 算法学习导图+经典排序算法PHP实现
周末抽时间整理下算法,完整导图可点击下面链接获取. 点我看完整算法导图 八种排序算法的php实现 代码如下 拷贝后可直接运行 先上个运行后的图 代码:(有的自己些的 有的根据网友整理) <?ph ...
- 低秩稀疏矩阵恢复|ADM(IALM)算法
一曲新词酒一杯,去年天气旧亭台.夕阳西下几时回? 无可奈何花落去,似曾相识燕归来.小园香径独徘徊. ---<浣溪沙·一曲新词酒一杯>--晏殊 更多精彩内容请关注微信公众号 "优化 ...
- sg函数的学习
1 .anti-nim 2 . 可以拆分的
- 设置Linux主机SSH访问服务
检查是否开启22端口访问权限. 检查是否安装openssh-server 开启ssh服务:sudo service sshd start 使用ssh客户端进行访问:ssh userName@IP
- java学生管理系统(增、删、改、查功能)
package mm; import java.util.Scanner;import java.util.ArrayList; class Student1 { private String stu ...
- 使用read、readline、readlines和pd.read_csv、pd.read_table、pd.read_fwf、pd.read_excel获取数据
从文本文件读取数据 法一: 使用read.readline.readlines读取数据 read([size]):从文件读取指定的字节数.如果未给定或为负值,则去取全部.返回数据类型为字符串(将所有行 ...
- kubernetes基础概念知多少
kubernetes(简称k8s)是一种用于在一组主机上运行和协同容器化应用程序的管理平台,皆在提供高可用.高扩展性和可预测性的方式来管理容器应用的生命周期.通过k8s,用户可以定义程序运行方式.部署 ...
- Spring-cloud微服务实战【六】:接口服务feign
在上一篇文章中,我们使用了ribbon进行负载均衡,但是仔细思考一下,我们的请求封装和调用以及结果的返回都是我们自己编码完成的,如果需要调用的接口很多,那么无疑开发量是比较大的,那有没有比较好的方式呢 ...
- 编程基础系列--之--浅谈List、Set、Map和泛型(一)——单列集合
之前在学习Java时对于泛型,集合的理解一直模模糊糊,随着时间的推移,对泛型和集合有了一些浅显的认知,打算写出来巩固一下,也希望各位大佬能指出理解不当之处,万分感谢!!! 在Java语言中,集合分为两 ...
- 智能指针shared_ptr使用学习
当需要shared_ptr实现向上向下转换时,可以使用 dynamic_pointer_cast 来进行转换 下面是例子: #include <memory> using namespac ...