问题标签 [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.

0 投票
1 回答
138 浏览

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

谢谢

0 投票
1 回答
67 浏览

c - Windows 套接字程序中未收到 udp 数据

我是 Windows 套接字编程的新手。我有一个设备,它通过基于 ipv6 协议的端口提供 udp 数据。我试图在 Windows 7 中用 Visual Studio 编写的控制台应用程序中捕获这一点。套接字创建和绑定成功,但没有从指定的端口收到任何内容。

我已经在 Linux 中完成了这项工作,因为我基本上是一名 linux 系统软件开发人员,并且它运行良好。我还需要做什么才能在 Windows 中获取 UDP 数据包。我在 windows 中检查了 wireshark,发现 UDP 数据包是从设备到 PC 的。

在 Linux 中完成的工作代码:

Windows 中的代码:

0 投票
1 回答
1164 浏览

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 链接,我不需要这样做。

我在这里想念什么?有人做过这项工作吗?

0 投票
1 回答
439 浏览

windows - 如果在一个进程中出现多个请求不同 WinSock 版本的 WSAStartup 调用会发生什么?

WSAStartup() 可以在单个进程中多次调用,只要 WinSock dll 支持请求的版本并且对 WSAStartup() 和 WSACleanup() 的调用是平衡的。除此之外,允许使用不同 WinSock 版本的多个套接字。(参见这篇文章:是否可以判断 WSAStartup 是否已在进程中调用?

那么,这些不同的 WinSock 版本是如何共存的呢?

例如,如果我请求为我的应用程序使用特定的 WinSock 版本,并且我的应用程序还加载了恰好请求使用不同版本的第三方 dll,该怎么办?使用什么版本,何时使用?

0 投票
0 回答
345 浏览

c - Windows 10 中的套接字库的名称是什么

我正在尝试编译回显服务器代码。我在 Windows 10 上使用 CodeBlocks IDE。

我收到几个错误

编译代码的命令是

我想问题是IDE没有链接具有socket代码实现的库。

我应该链接的库的名称是什么以及如何获取它。我的系统上安装了 Win 10 SDK。

0 投票
1 回答
331 浏览

c# - 循环不会因 Thread 和 CancellationToken 而停止

我正在使用异步回调处理 Windows 套接字应用程序。如果我使用 Thread 启动_StartListening,当我调用时StopListening,循环仍然停止在allDone.WaitOne(). 但是Task版本就可以了。

有什么不同?

我的代码是这个的修改版本

原始版本具有felix-bManualResetEvent提到的竞争条件。我把它改成了,但问题仍然存在。SemaphoreSlim

我在调试模式下尝试过,即使我没有启动客户端,似乎if (cancelToken.IsCancellationRequested)在我调用后也不会遇到断点。StopListening

对不起。我发现我不小心启动了两个套接字服务器。那就是问题所在。

0 投票
2 回答
339 浏览

sql-server - 在 SQL CLR 中使用套接字 API

我正在尝试使用第三方 API,它是基于套接字的 API,带有 SQL CLR 和 vb.net。我知道如何使用 REST API 来做到这一点,但是,我不知道如何开始使用 Socket API。

有没有人有任何参考资料或我可以用来学习的非常基本的“GET”示例?

0 投票
1 回答
214 浏览

bind - 将 ipv6 slaac 地址绑定到 Windows IP 堆栈错误 10049

背景:

这是第二次调用bind停止我的项目的开发进度。第一次是为任何未知环境选择套接字接口bind是当时的感知错误,其不透明的源代码不允许我看到虚假的 Hyper-V 接口。我实现了 Remy Lebeau 的建议,即使用GetAdaptersAddresses循环通过适配器接口以获得所需的条目。因为我正在创建一个ipv6 slaacIP 地址,所以接下来我实现了 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 是不可破解的。该地址不存在安全风险,因此不应受到管理员权限要求的约束。

0 投票
1 回答
244 浏览

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 地址将显示LISTENINGnetstat -a.

0 投票
1 回答
68 浏览

bind - bind() 适用于 ipv6 无线适配器接口,但不适用于 ipv6 以太网(错误 10049)

背景

在我的程序开始时,我使用GetAdaptersAddresses构建了一个适配器接口地址的链接列表。后来,创建ipv6 slaac地址后,调用Socket()Bind()Listen()成功了,那里IfType是Wireless,也就是IfType71( IF_TYPE_IEEE80211)。我的过滤器参数是familyifType。我通过连接和断开以太网电缆进行测试。对于每种情况,我的软件都会找到具有上述参数的活动接口:连接它首先找到以太网,断开连接它没有找到以太网,然后进一步寻找无线接口。有关相关代码片段,请参阅 CreateUnicastIpAddressEntry 之后的 SO Unable to GetUnicastIpAddressEntry 。

问题

但是,如果接口IfType是 6 ( IF_TYPE_ETHERNET_CSMACD),则Socket()成功,但Bind()当然Listen()会失败。

问题

是否还有其他我遗漏的因素或接口参数可以决定结果?

尝试1

循环遍历所有 ipv6 接口只是为了凭经验确定是否有任何成功。两台机器上都没有。

尝试2

查找scope id并将其附加到地址,但是,我没有scope id在接口链接列表中看到该参数。