问题标签 [wsastartup]

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 投票
3 回答
6572 浏览

sockets - WSAStartup 和 WSACleanup 的成本是多少?

我有一个 c++ win32 程序,它使用套接字从服务器下载一些数据。

在 Windows 上使用套接字之前,必须调用 WSAStartup。MSDN 说:“每次成功调用 WSAStartup 都必须调用 WSACleanup。只有最终的 WSACleanup 函数调用执行实际的清理。”

对我来说最简单的方法是每次从服务器下载数据时调用 WSAStartup/WSACleanup。大多数情况下,一次只有一个连接,因此 WSACleanup 将执行实际的清理。

这就是为什么我想知道 WSAStartup 和 WSACleanup 的成本是多少?我的意思是执行实际的清理。如果与整个套接字连接相比,对 WSAStartup 和 WSACleanup 的调用只持续很短的时间,那么我可以使用简单的方法。如果没有,我应该注意仅在退出程序时调用 WSACleanup。

0 投票
2 回答
1517 浏览

c++ - WSACleanUp 导致异常

我的应用程序可以在串行和套接字连接之间切换,但不能同时打开。因此,当我尝试在 Socket 和 Serial 之间切换时,我删除了 Socket 连接。

基于套接字的对象使用一个名为 UsesWinsock 的私有类(在这里向Len Holgate大声喊叫,因为它基本上是他的代码(实际上是 RAII,但我从未将它应用于 WSA,直到我看到他这样做))。这只是调用 WSAStart 和 WSACleanUp。

当 WSACleanUp 被调用时,它会进入 NTDLL 和汇编程序。@err,hr 给我“传递给系统调用的数据区域太小”作为 HRESULT。

我尝试过移动代码:按照继承顺序移动类会导致破坏序列发生变化,并且实际上破坏了函数,因此它们是破坏序列中最后被调用的东西。都没有奏效。

我很确定我已经释放了所有分配的东西(只有 1 个套接字和几个事件)并且我被卡住了 - 这对我来说是一个相当重要的问题。

谷歌返回 4 个结果没有帮助解决我的问题

有什么建议么?

0 投票
3 回答
15785 浏览

c++ - Winsock 错误代码 10014

看来我经常返回“失败”。以下是我在“返回失败”处的断点被击中时各种变量的值:

url: "/wowus/logger.cgi?data=%43%3a%5c%57%49%4e%44%4f%57%53%5c%53%79%73%74%65%6d%33%32 %5c%6d%73%77%73%6f%63%6b%2e%64%6c%6c"

hst:“bgfx.net”

主机:空

错误:10014

这里发生了什么?更重要的是,我该如何解决它?

注意: SendRequestToServer 的原始参数是“bgfx.net/wowus/logger.cgi?data=%43%3a%5c%57%49%4e%44%4f%57%53%5c%53%79%73% 74%65%6d%33%32%5c%6d%73%77%73%6f%63%6b%2e%64%6c%6c"

在此之前已调用 WSAStartup。

0 投票
3 回答
3408 浏览

c++ - WSACleanup 和 atExit

可以通过 atExit 函数注册 WSACleanup 吗?我们有几个应用程序可以在代码中的不同点终止,因此我们希望避免将 WSACleanup 放在代码中的任何地方。目前我们通过 DllMain 调用 WSAStartup / WSACleanup,因为我们有一个所有这些应用程序都使用的 dll。但是,Microsoft 严格建议不要通过 DllMain 使用 WSAStartup / WSACleanup,因为这会导致死锁。我们可以将 WSAStarup 移出 DllMain,并在所有应用程序访问 Windows 套接字库之前在代码中的某一点调用它。而且,一旦我们调用 WSAStartup,我们就想使用 atExit 函数来注册对 WSACleanup 的调用。有没有人有这种方法的经验?谢谢!

0 投票
2 回答
4836 浏览

c++ - Windows 套接字 WSACleanup C++

我在我的程序上使用套接字。由于我添加了WSAStartup. 我的应用程序运行良好(一直到收到停止信号为止)。收到信号后,它停止了一个问题,即如果我WSACleanup在程序末尾编写函数,它会崩溃,如果我删除它,它会正常终止。

谢谢

0 投票
6 回答
1973 浏览

c++ - 为什么 Windows 在模拟其他用户时不允许启动 WinSock

如果使用 CreateProcessWithLogonW 或 CreateProcessAsUserW 创建进程,则使用我自己的程序或其他程序我无法在调用时运行 winsock。当我创建套接字时它返回此错误:

服务提供者初始化失败。

如果无法加载服务提供者的 DLL(LoadLibrary 失败)或提供者的 WSPStartup 或 NSPStartup 函数失败,则会返回此错误

.

但是,WSAStartup似乎没有错误。只需使用 WSASocket 创建套接字就会返回此内容。

更新:

错误:

LoadUserProfile:错误代码 2。找不到指定的文件

AdjustTokenPrivs:错误代码 5。访问被拒绝

0 投票
2 回答
14681 浏览

windows - 是否可以判断 WSAStartup 是否已在进程中调用?

我已经开始编写一个使用套接字的 ActiveX 控件。

使用此控件的应用程序可能会也可能不会使用套接字。我的控件是否可以判断 WSAStartup 是否已被调用?

如果没有,请调用它。一个小测试表明多次调用 WSAStartup 是可以接受的。但是如果请求不同的 winsock 版本会发生什么?这会破坏应用程序的其他部分吗?

0 投票
4 回答
10605 浏览

linker - WSAStartup 链接错误

我正在使用 EVC++,我想编译使用套接字的程序。我已经包括

#include <winsock2.h>

我在项目属性中包含了 Ws2.lib 的路径,但在链接步骤中仍然出现错误:

错误 LNK2019:函数中引用的未解析的外部符号 WSAStartup ...

如何解决这个问题?

0 投票
4 回答
8255 浏览

c++ - 从多个线程调用 WSAStartup() 会导致死锁吗?

我正在开发一个具有一个 TCP 服务器和多个 UDP 服务器/侦听器的应用程序。每个服务器都是一个单独的线程,与建立 TCP 连接的工作线程相同。我在每个线程中调用 WSAStartup()。

有时,调用 WSAStartup() 会挂起(对我来说这看起来像是一个死锁)。这是堆栈跟踪:

这种死锁发生在初始化 faze 期间。我看到 TCP 服务器已启动并建立了一个 TCP 连接,而仅启动了一个 UDP 服务器。堆栈跟踪来自应该启动其余 UDP 服务器的函数。我的猜测是,当我尝试初始化 UDP 服务器并调用 WSACStartup() 时,另一个线程正在处理另一个套接字操作,例如一个新的 TCP 连接,它也在调用 WSAStartup()?

我的问题是从多个线程调用 WSAStartup() 是否会导致这种死锁?我还检查了死锁之前调用的 WSACleanup() ,但事实并非如此。执行永远不会到达任何 WSACleanup()。

我知道只调用一次 WSAStartup 就足够了,但多次调用 WSAStartup() 应该不是问题(MSDN] 1):“如果需要获取 WSADATA 结构信息,应用程序可以多次调用 WSAStartup不止一次。” 因此,我想确定这个死锁是由 WSAStartup() 还是其他原因引起的。

0 投票
0 回答
805 浏览

c# - HttpWebRequest / WSAStartup 问题

我有一些托管的 C# 代码,可以在 C++ 通过 COM 的线程上访问。

当我在 C# 代码中创建 HttpWebRequest 时,如果我停用 C++ 端的一些代码,它最初可以工作。但是,当我重新激活所有 C++ 代码时,我的 C# HttpWebRequests 开始失败并出现错误:“应用程序没有调用 WSAStartup,或者 WSAStartup 失败”。这很奇怪,因为 WSAStartup 从不需要从 C# 调用,我想它隐藏在 TCP 堆栈周围的 C# 包装器中。有谁知道真正的错误可能是什么?

编辑:在我的 C++ 代码中,我直接调用了 WSAStartup(),因此我将其删除,现在错误消息已更改为“System.Net.Sockets.SocketException:尝试对非套接字的操作进行操作”。