问题标签 [winsock2]

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 回答
303 浏览

c++ - 套接字编程 Xp > Vista, Vista > XP

我正在开发一个程序,它将图像从一台计算机发送到另一台计算机(类似于没有鼠标/键盘输入的远程协助)。我用来测试的两台计算机是一台 Windows XP 机器和一台 Windows Vista。我有一台直接连接到路由器的固定 XP 机器,以及一台通过无线连接的笔记本电脑。

从 XP 到 Vista 的传输效果很好,我能够获得在 Vista 上显示的恒定图像流。但是,当我翻转它并将图像从 Vista 发送到 XP 时,它不起作用。我还尝试了本地“复制”,即在没有网络的情况下获取图像流,这适用于 Vista 和 XP。这是两台机器上完全相同的程序。

我认为这并不重要,但我使用 GDI+ 来处理图像。所以我通过网络上的流发送一个 .jpg 并在另一端重建它。

我的网络消息类称为NetMsg。它由 achar* type和 a组成char* data。类型决定了我如何解释数据,这里没有问题。
我们将计算机称为#1 和#2。
当创建连接并且我在#1 上标记了要发送的区域时:
001> #1 发送类型 RESIZE // 以使#2 上的窗口与我在#1 上标记的区域大小相同
002> #1发送类型 PICTURE_DATA // 这是实际的图像数据
003> #2 收到上述两条消息后,发送类型 REQUEST_MORE // #2 想要更多图像数据
004> #转到步骤 1

在将图像数据从 XP 发送到 Vista 时,我什至都懒得调试它,因为它工作得很好,完全符合我的要求。但是,当 Vista 发送到 XP 时,我注意到以下内容:

  • 接收到的数据实际上可以是两个NetMsgs。我通过将数据分成几个来支持这一点NetMsgs
  • 收到的数据可能不完整,即我必须等待更多数据。我通过将 a 标记NetMsg为不完整并在下一次数据传输时完成它来支持这一点。(以及第一步的组合)

这几乎成功了,因为我正确传输了一些图像,但是它突然停止了。我没有彻底调试过,所以我不知道为什么数据突然停止了。但是:

我不明白的是,这在从 XP 发送到 Vista 时效果很好,但反之则不行。我错过了什么?

如果您需要提取代码,请告诉我,但是,它非常庞大......大约 500 行.. 否则,我正在寻找从 Vista 向 XP 发送数据时的已知问题。

任何帮助和/或反馈表示赞赏!

0 投票
1 回答
1368 浏览

c++ - Winsock2 recv() 挂钩到远程进程

我试图将自定义 recv() winsock2.0 方法连接到远程进程,以便执行我的函数而不是进程中的函数,我一直在谷歌搜索,我发现了一些非常好的示例,但它们缺乏描述

现在我的问题是,这是什么意思,或者说,这是某种指向真正 recv() 函数的指针吗?

然后是自定义函数的另一段代码

抱歉,如果这些问题听起来很基础,我是 2 或 3 周前才开始学习的。谢谢。

0 投票
3 回答
1875 浏览

c++ - 在 winsock2 中使用 C++ 创建套接字的问题

我遇到了最奇怪的问题,让我头疼。考虑以下代码:

发生的事情是 receive_socket 没有绑定,我得到 SOCKET_ERROR。当我调试程序并检查receive_socket时,它似乎只是乱码。我在“std::map”行上放了一个断点。当我进入上述代码的每一行时,调试光标直接从“无符号短端口”行跳转到第一个“local_address.sin”行,即使我正在使用步进(F11),它也不会停止struct、int、char 或 SOCKET 行,它会直接跳过它们。

此时,我将鼠标悬停在 local_address、from_address、result、buffer 和 receive_socket 上。他们都充满了乱码。这是因为我还没有定义这些变量吗?我还注意到,当我到达上述代码的底部时,local_address.sin_port 设置为 19992,但应该是 6222?

编辑:这是我的绑定代码,因为 if 语句为真而失败:

0 投票
1 回答
897 浏览

c - 使用什么来代替针对旧版 Windows 的 getaddrinfo() 和 freeaddrinfo()?

根据要求,我的目标是不可用的旧旧 Windows 系统(9x 分支getaddrinfo()freeaddrinfo()

我可以用什么代替它?我现在使用的代码是从 MSDN 站点中提取的(我在 Vista 计算机上测试它):

0 投票
1 回答
117 浏览

c - 是否可以使用套接字使用连接代理?

我需要从启用了 SSL 代理的环境连接到服务器,是否可以仅使用套接字来处理该环境?它是一个无 SSL 代理,这可能吗?

非常感谢。

0 投票
1 回答
353 浏览

c - 有什么方法可以使用 getaddrinfo() 和 freeaddrinfo() 并且仍然是与旧版 Windows 兼容的程序?

在 Winsock2 库中getaddrinfo()freeaddrinfo()仅在 Windows XP 及更高版本中添加。我知道如何在旧系统中替换它们,但是取决于 Windows 版本的有条件使用将无济于事。

应用程序不会在 9x 中启动,并显示一条消息,指出它已链接到 WS2_32.dll 中缺少的导出。

我正在使用 MinGW 编译和链接代码,并希望继续使用它。也许我自己写这些功能?

非常感谢你所做的一切。

0 投票
2 回答
3285 浏览

delphi - 有没有delphi winsock2库?

我需要使用 WSASocket 函数等...

0 投票
3 回答
5852 浏览

c# - Winsock tcp/ip 套接字侦听但连接被拒绝,竞争条件?

这涉及两个自动化单元测试,每个测试都启动一个 tcp/ip 服务器,该服务器创建一个非阻塞套接字,然后在 select() 上为连接和下载一些数据的客户端循环 bind()s 和 listen()s。

问题是它们在单独运行时运行良好,但是当作为测试套件运行时,第二个测试客户端将无法与 WSCONNREFUSED 连接......

除非

他们之间有几秒钟的 Thread.Sleep() ??!!!

有趣的是,在任何失败后,每 1 秒都会有一个重试循环用于连接。所以第二个测试循环了一段时间,直到 10 分钟后超时。

在此期间,netstat -na 显示服务器套接字的正确端口号处于 LISTEN 状态。那么如果它处于监听状态呢?为什么它不接受连接?

在代码中,有日志消息显示 select NEVER 甚至没有准备好读取套接字(这意味着当它应用于侦听套接字时准备好接受连接)。

显然,问题必须与完成一个测试之间的某种竞争条件有关,这意味着套接字每一端的 close() 和 shutdown(),以及下一个测试的启动。

如果重试逻辑允许它在几秒钟后最终连接,这不会那么糟糕。然而,它似乎被“搞砸了”,甚至不会重试。

然而,由于某种奇怪的原因,监听套接字说它处于 LISTEN 状态,即使一直拒绝连接。

所以这意味着实际上是 Windoze O/S 正在捕获 SYN 数据包并返回一个 RST 数据包(这意味着“连接被拒绝”)。

我唯一一次看到这个错误是当代码出现问题导致数百个套接字卡在 TIME_WAIT 状态时。但这里不是这样。netstat 在任何给定时刻仅显示大约十几个套接字,其中 TIME_WAIT 中只有 1 或 2 个。

请帮忙。

0 投票
3 回答
3349 浏览

c++ - 增加特定套接字的 TCP 接收窗口

如何增加特定套接字的 TCP 接收窗口?- 我知道如何通过设置注册表项 TcpWindowSize 对所有套接字执行此操作,但是如何为特定的套接字执行此操作?

根据MSFT 的文件,方法是

调用 Windows 套接字函数 setsockopt,该函数基于每个套接字设置接收窗口。

但是在setsockopt中,提到了 SO_RCVBUF :

指定为接收保留的每个套接字的总缓冲区空间。这与 SO_MAX_MSG_SIZE 无关,也不一定对应 TCP 接收窗口的大小。

那么有可能吗?如何?

谢谢。

0 投票
2 回答
2956 浏览

c++ - 蓝牙服务问题

我需要创建一个自定义蓝牙服务,我必须使用 C++ 开发它。我阅读了很多示例,但没有成功发布具有自定义 UUID 的新服务。我需要指定一个 UUID 才能从 android 应用程序连接到服务。这就是我写的:

当我打印使用 get getsockname 检索到的 SOCKADDR_BTH 结构时,我得到一个不是我的 UUID。此外,如果我使用从 getsockname 读取的 UUID 连接 Android 应用程序,则连接失败并出现以下异常:

你可以帮帮我吗??

谢谢!