问题标签 [windows-socket-api]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - 如何在windows中找到进程打开的socket fds
我有一个在 Windows 中运行的客户端进程(win 7/win 2008 服务器)。任务是为它打开的一个套接字启用keepalive以与服务器连接。为了建立这个连接,我正在使用 Windows API(连接到 MSSQL 服务器),我无法从中检索它创建的套接字 fd。
1)检索Windows进程打开的所有套接字fd的方法是什么(非python方法,因为二进制文件是基于C++的)
2)有没有办法从windows API SQLAllocHandle或SQLDriverConnect返回的句柄中检索socket fd
谢谢
c - Windows 套接字程序中未收到 udp 数据
我是 Windows 套接字编程的新手。我有一个设备,它通过基于 ipv6 协议的端口提供 udp 数据。我试图在 Windows 7 中用 Visual Studio 编写的控制台应用程序中捕获这一点。套接字创建和绑定成功,但没有从指定的端口收到任何内容。
我已经在 Linux 中完成了这项工作,因为我基本上是一名 linux 系统软件开发人员,并且它运行良好。我还需要做什么才能在 Windows 中获取 UDP 数据包。我在 windows 中检查了 wireshark,发现 UDP 数据包是从设备到 PC 的。
在 Linux 中完成的工作代码:
Windows 中的代码:
c++ - 为什么我的套接字 connect() 在 WSASetSocketSecurity() 之后失败?
我正在教一门课,我想向学生展示如何在 C++ 中打开一个套接字并在 Linux 和 Windows 下阅读 http: 和 https: 网页。Linux 版本使用OpenSSL轻而易举。但是在使用微软的 WSA 套接字库的 Windows 下,我只能读取非 ssl 页面。我不知道如何让他们的WSASetSocketSecurity()函数工作。
通过注释掉以下代码片段中的 WSASetSocketSecurity 调用,我可以读取 http: (port 80) 页面。我能够connect()到 https: (端口 443) 主机,但尝试发送 HTML GET 请求,然后recv() 页面按预期失败,没有任何返回或来自某些服务器的 400 错误请求页面,因为我没有不是协商加密。
取消注释 WSASetSocketSecurity 调用以保证加密,连接调用在 http: 和 https: 页面上总是失败并显示 WSAGetLastError = 10060(连接超时)。
调用 WSASetSocketSecurity 但指定允许不安全的连接允许我读取 http: 页面,但使用 https: 页面失败,就像根本没有调用 WSASetSocketSecurity 一样。
从根本上说,我无法打开加密然后连接,我不知道为什么。
我已经尝试过用 WSAxxx() 版本替换套接字、连接和其他调用的实验,想象可能会有类似于在 Linux 中连接后进行 SSL_connect 调用的方式的区别,但这没有区别。我唯一能想到的我还没有尝试过的事情是使用 WSASetSocketPeerTargetName() 对主机进行身份验证,但在我看来,如果我想要的只是一个 SSL 链接,我不需要这样做。
我在这里想念什么?有人做过这项工作吗?
windows - 如果在一个进程中出现多个请求不同 WinSock 版本的 WSAStartup 调用会发生什么?
WSAStartup() 可以在单个进程中多次调用,只要 WinSock dll 支持请求的版本并且对 WSAStartup() 和 WSACleanup() 的调用是平衡的。除此之外,允许使用不同 WinSock 版本的多个套接字。(参见这篇文章:是否可以判断 WSAStartup 是否已在进程中调用?)
那么,这些不同的 WinSock 版本是如何共存的呢?
例如,如果我请求为我的应用程序使用特定的 WinSock 版本,并且我的应用程序还加载了恰好请求使用不同版本的第三方 dll,该怎么办?使用什么版本,何时使用?
c - Windows 10 中的套接字库的名称是什么
我正在尝试编译回显服务器代码。我在 Windows 10 上使用 CodeBlocks IDE。
我收到几个错误
编译代码的命令是
我想问题是IDE没有链接具有socket
代码实现的库。
我应该链接的库的名称是什么以及如何获取它。我的系统上安装了 Win 10 SDK。
c# - 循环不会因 Thread 和 CancellationToken 而停止
我正在使用异步回调处理 Windows 套接字应用程序。如果我使用 Thread 启动_StartListening
,当我调用时StopListening
,循环仍然停止在allDone.WaitOne()
. 但是Task版本就可以了。
有什么不同?
我的代码是这个的修改版本
原始版本具有felix-bManualResetEvent
提到的竞争条件。我把它改成了,但问题仍然存在。SemaphoreSlim
我在调试模式下尝试过,即使我没有启动客户端,似乎if (cancelToken.IsCancellationRequested)
在我调用后也不会遇到断点。StopListening
对不起。我发现我不小心启动了两个套接字服务器。那就是问题所在。
sql-server - 在 SQL CLR 中使用套接字 API
我正在尝试使用第三方 API,它是基于套接字的 API,带有 SQL CLR 和 vb.net。我知道如何使用 REST API 来做到这一点,但是,我不知道如何开始使用 Socket API。
有没有人有任何参考资料或我可以用来学习的非常基本的“GET”示例?
bind - 将 ipv6 slaac 地址绑定到 Windows IP 堆栈错误 10049
背景:
这是第二次调用bind
停止我的项目的开发进度。第一次是为任何未知环境选择套接字接口。bind
是当时的感知错误,其不透明的源代码不允许我看到虚假的 Hyper-V 接口。我实现了 Remy Lebeau 的建议,即使用GetAdaptersAddresses循环通过适配器接口以获得所需的条目。因为我正在创建一个ipv6 slaac
IP 地址,所以接下来我实现了 RFC7217。这会产生一个像这样的地址:2600:8806:2700:115:617e:7efc:2e2a:31cc
其中的network id
前 8 个字节是标准的,来自路由器广告'interface id',后 8 个字节,是 RFC7217 告诉你如何制作的。我能够毫无问题地为创建的地址创建套接字对象。
问题:
但是当我尝试访问bind
该地址时,我收到错误WSAEADDRNOTAVAIL (10049):
请求的地址在其上下文中无效。如果 name 参数指向的指定地址不是此计算机上的有效本地 IP 地址,则返回此错误。
间接地,这意味着bind
工作。这只是意味着 Windows 以前从未见过该地址,因为它不是由 ISP 提供的。但这就是 SLAAC 地址的本质。
问题:
我应该如何继续,以便 Windows 可以识别我的 slaac 地址,没有它我无法Listen
拨打电话?是否有其他人解决了这个问题,也许是另一种方式?
尝试1:
调用CreateUnicastIpAddressEntry。不幸的是,此调用要求应用程序具有管理员权限。我在微软的开发者社区中提出了这个建议: 调用 CreateUnicastIpAddressEntry 函数 as user 而不是 as administrator。
编辑1:
我现在已经运行了 MS 示例程序(请参阅Unable to GetUnicastIpAddressEntry after CreateUnicastIpAddressEntry)。这些功能可以工作,但在检索 ipv6 地址时出现问题。成功输入后, bind()仍然不起作用。
编辑2:
进一步的测试表明,Bind()
以太网连接仍然失败。请参阅bind() 适用于 ipv6 无线适配器接口,但不适用于 ipv6 以太网(错误 10049)。__imp_bind
由于微软对未记录函数的黑盒调用,一个简单的调试问题再次变得几乎无法解决。
结论:
ipv6 slaac 地址的网络 ID 通过路由器来自 ISP,因此不是安全威胁。它的接口 id 是不可破解的。该地址不存在安全风险,因此不应受到管理员权限要求的约束。
ip-address - CreateUnicastIpAddressEntry 后无法获取 UnicastIpAddressEntry
背景:
我正在尝试加快使用符合RFC7217的ipv6 地址。为此,我编写了代码来创建一个有效的可路由 ipv6 地址,例如2600:8806:2700:115:c4a3:36d8:77e2:cd1e
. 我知道我需要在 windows 中输入新地址,然后才能绑定到它。我认为这两种方法可以解决问题。因此,使用我的一个 IP 地址,我执行了在CreateUnicastIpAddressEntry中找到的示例代码。然后,使用相同的 IP 地址,我执行了GetUnicastIpAddressEntry中的示例代码。
问题:
我希望再次检索 IP 地址。相反,我得到了ERROR_NOT_FOUND (2)。
分析: 我知道 IP 地址正在进入系统,因为如果我使用相同的 IP 地址再次运行 CreateUnicastIpAddressEntry,我会得到ERROR_OBJECT_ALREADY_EXISTS。
问题:
有这两种 ip 方法经验的人知道这个错误代码在这种情况下是什么意思吗?对于这两种windows ip方法,输入和取回相同的ip地址是否合理?
CreateUnicastIpAddressEntry 的示例代码需要一些工作,因此如果有人想尝试,我可以将其与我的更改一起上传到某个地方。GetUnicastIpAddressEntry 示例代码几乎是开箱即用的。
编辑1:
以下是修改后的示例代码,说明了我必须进行的更改CreateUnicastIpAddressEntry()
才能工作,MFC 才能创建套接字、绑定到它并监听它。
我修改的CreateUnicastIpAddressEntry()
示例代码使其适用于 IPv6。我所有的评论都以 RT:date 开头。其余的都是原始示例代码编写者的。我还硬编码了一个特定生成的 IPv6 Slaac 地址,该地址2600:8806:2700
取自我的特定路由器广告的前缀,bf72
是子网 id,对我而言,它是一个介于 1 和 65535 之间的随机唯一数字。并且596c:919b:9499:e0db
使用了一个符合 RFC7217 的接口 id这里用于测试目的。
运行此代码会将地址输入到内部地址表中。
这里是 MFC Socket、Bind 和 Listen 代码片段,展示了如何使用 MFC,以便它可以与 IPv6 ip 地址一起使用。Microsoft 文档说 MFC 不适用于 IPv6,但这是因为 Create 函数的地址族参数默认为 AF_INET (IPv4)。所以如果调用MFC的底层函数,地址族参数可以设置为AF_INET6。
这是修改后的 MFCSocket
调用:
请注意单独的Bind
调用,一个用于标准 MFC 代码的 AF_INET,另一个用于 AF_INET6。
这是绑定调用:
注意对 的调用EnterUnicastIpAddrIntoInternalTable()
。这可能是您希望使用修改后的CreateUnicastIpAddressEntry()
代码将新地址放入内部表的地方。
所有放在一起,IP 地址将显示LISTENING
为netstat -a
.
bind - bind() 适用于 ipv6 无线适配器接口,但不适用于 ipv6 以太网(错误 10049)
背景
在我的程序开始时,我使用GetAdaptersAddresses构建了一个适配器接口地址的链接列表。后来,创建ipv6 slaac
地址后,调用Socket()
,Bind()
都Listen()
成功了,那里IfType
是Wireless,也就是IfType
71( IF_TYPE_IEEE80211
)。我的过滤器参数是family
和ifType
。我通过连接和断开以太网电缆进行测试。对于每种情况,我的软件都会找到具有上述参数的活动接口:连接它首先找到以太网,断开连接它没有找到以太网,然后进一步寻找无线接口。有关相关代码片段,请参阅 CreateUnicastIpAddressEntry 之后的 SO Unable to GetUnicastIpAddressEntry 。
问题
但是,如果接口IfType
是 6 ( IF_TYPE_ETHERNET_CSMACD
),则Socket()
成功,但Bind()
当然Listen()
会失败。
问题
是否还有其他我遗漏的因素或接口参数可以决定结果?
尝试1
循环遍历所有 ipv6 接口只是为了凭经验确定是否有任何成功。两台机器上都没有。
尝试2
查找scope id
并将其附加到地址,但是,我没有scope id
在接口链接列表中看到该参数。