问题标签 [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 投票
6 回答
2333 浏览

c++ - 接收使用 C 套接字发送的所有数据

如果我编写一个服务器,如果我不知道该客户端如何发送数据,我如何实现接收功能以获取特定客户端发送的所有数据?
我正在使用 TCP/IP 协议。

0 投票
1 回答
659 浏览

windows-xp - Windows XP 和 ICMPv6 上的 WinSock2

我正在尝试ping6使用 WinSock2 以编程方式发送 ICMPv6 回显请求()。ICMPv6 校验和是根据将要发送的整个 IPv6 数据包计算的。出于这个原因 - 据我了解 - 操作系统(内核?)应该在发送数据包时计算它并将其写入 ICMPv6 标头。

这在 SUSE Linux Enterprise Server 11 上运行良好,但是,Windows XP 似乎没有这样做。它将校验和保留为我默认设置的值(零,我使用 Wireshark 进行了分析),因此接收端将丢弃它而不回复。

IPv6 在这台 WinXP 机器上正确设置。在 Wireshark 的帮助下,我什至发现它可以正确响应来自 SUSE Linux 服务器的 ICMPv6 ping,使用相同的代码发送。所以不可能是Windows XP 不支持ICMPv6。但是,我想知道Windows XP下的WinSock2是否可以。

WinSock2 API 确实提供了IPPROTO_ICMPV6我为其创建原始套接字的协议。是否需要设置任何特殊的套接字选项才能自动计算 ICMPv6 校验和,或者是否有任何其他技巧?

0 投票
3 回答
15526 浏览

c - 为什么我的 C 程序中出现 ws2_32.dll 的链接器错误?

我正在 Visual Studio 2010 中编写程序。我无法链接以ws2_32.dll我的项目命名的文件。

谁能告诉我我该怎么做?

0 投票
1 回答
2802 浏览

c# - TCP/IP Windows 7 环回适配器上的数据包延迟问题(或软件中的错误?)

我们有一个客户端和服务器应用程序当前在同一台 Windows 7 64 位机器上进行测试。它们都是用 C# 编写的,并使用 P/Invoke 调用 Winsock2 库。

该应用程序总体上运行良好,没有任何错误。tcp/ip 上每个“跳跃”的延迟平均约为 350 微秒。

但是,有时在接收数据包之前会有超过 40 到 50 毫秒的非常长的延迟,然后突然它们都会到达。

迄今为止的诊断工作:

  1. 在接收数据的这些延迟期间,服务器继续记录它正在发送数据包。它设置为每 1 毫秒发送一次测试数据包,它会在 15 或 20 毫秒内发送一次测试数据包,有时会在客户端收到任何测试数据包之前长达 50 毫秒。

  2. tcpdump 用于嗅探环回适配器上的数据包,并显示在此延迟期间,像往常一样有从服务器端口 (6488) 到客户端端口 (61743) 的流量。

  3. 客户端在循环中调用 select() winsock2 调用,因此在 select() 调用之前通过计数器记录表明它具有正确的文件描述符。当然,这在延迟前后都可以正常工作。

  4. 在 select() 调用之后立即进一步记录显示 fd 不存在——这意味着对套接字的读取将阻塞。但是,在没有任何延迟的传输期间,日志显示它按预期工作,因此 select() 返回套接字的 fd 以进行非阻塞读取。

简而言之,环回适配器似乎将这些数据包保存在某个地方很长一段时间,然后才最终将它们传送到接收端。

任何进一步的想法或解决方案?

一些想法是它经常声称重叠 I/O 在 Windows 上工作得更好,但如果你需要监听超过 64 个套接字,这似乎只对可伸缩性很重要。

是不是切换到重叠可以解决问题?我们希望避免,因为这会增加项目期限和预算。这应该适用于 select() 就好了。

此外,Windows中处理环回的进程或线程是否可以进行上下文切换或其他什么,如果是这样,是否有办法对其进行配置以避免这些延迟?

Edit: The correct answer was to ensure that the Nagle algorithm was disabled. We thought it was disabled but that's where the bug was found--in our in-house implementation of SetSocketOption() we used GetSocketOption() to verify. So it turns out you must set NoDelay prior to connecting or binding a socket or else it silently fails to have any effect.

Many thanks to Fun Mun Pieng for the correct answer!!!

0 投票
3 回答
2156 浏览

c - 如何使用c在winsock2中发送图像

我正在用 c (winsock2) 编写一个非常简单的网络服务器。

我能够返回我的 html 页面的内容。

目前,我正在做的是将文件内容写入 char* 缓冲区并使用“send()”发送

尽管当我尝试读取图像(jpg,bmp)时,我无法将字符写入缓冲区,因为某些字符是“null”(0)。

如何发送整个图像文件?

谢谢。

0 投票
2 回答
1457 浏览

c++ - 套接字 recv 调用将线程冻结大约。5秒

我有一个用 C++ 实现的客户端服务器体系结构,在 Windows 7 下具有阻塞套接字。一切运行良好,达到一定的负载水平。如果有几个客户端(例如 > 4 个)接收或发送兆字节的数据,有时与一个客户端的通信会冻结大约 5 秒。在这种情况下,所有其他客户端都按预期工作。

缓冲区大小为 8192 字节,服务器端的日志记录如下:

TimeStamp (s.ms) - 接收到的字节数

…</p>

1299514524.618 - 8192

1299514524.618 - 8192

1299514524.618 - 0004

1299514529.641 - 8192

1299514529.641 - 3744

1299514529.641 - 1460

1299514529.641 - 1460

1299514529.641 - 8192

…</p>

似乎在那 5 秒内只能读取 4 个字节。此外,我发现冻结时间总是在 5 秒左右——从来没有 4 秒或更短,也从来没有 6 秒或更多......

有任何想法吗?

此致

迈克尔

0 投票
1 回答
396 浏览

c++ - Winsock 的 send() 工作异常

我正在尝试编写一个接受连接并向客户端发送消息的实验服务器程序。我让客户端连接,但如果不做一些非常奇怪的事情,我似乎无法发送消息。

例如,在这个片段中,conn是一个连接的套接字:

吧,当我通过 Telnet 连接到它时,它什么也不显示,只是退出。但是,当我将这一行添加cout << sendRes到此片段的末尾时,它突然起作用并显示正在测试!在 Telnet 上,就像它应该的那样。

所以,我想问问知道的人,为什么会这样?

0 投票
2 回答
1353 浏览

c++ - 将一串数据标记为结构向量?

所以我有以下数据字符串,它是通过 TCP winsock 连接接收的,并且想做一个高级标记化,到一个结构向量中,其中每个结构代表一个记录。

字符串中的每条记录都由回车符分隔。我尝试拆分记录,但尚未拆分字段:

似乎完全没有必要再次重复所有代码以通过冒号(内部字段分隔符)将每个记录进一步标记到结构中并将每个结构推入向量中。我确信有更好的方法可以做到这一点,或者设计本身可能是错误的。

感谢您的任何帮助。

0 投票
3 回答
122 浏览

c++ - 担心处理对 accept() 的错误调用

我正在为个人学习目的编写一个MUD服务器,我很高兴地设法将套接字的东西打包成几个类,并且一切似乎都正常工作;服务器侦听并接受连接,当前从客户端获取文本并将其发送回。

问题是我不太确定如何处理返回 WSAEWOULDBLOCK 或有效套接字以外的其他内容的 accept() 调用。我是否只是将新套接字重置为 0 并返回,可能会出现一条错误消息,说明发生了不好的事情?这就是我现在正在做的事情,如果它发生 20 次,我将关闭服务器。

TopSocket 和 NewSocket 属于 SOCKET 类型,并在文件范围内声明。SocketList 是 MUDSocket* 的 std::list,而 MUDControlSocket 作为单例从 MUDSocket 派生。

如果您需要更多信息,请告诉我,并感谢您的帮助。

0 投票
2 回答
637 浏览

winapi - 连接到服务器的多个 Socket 客户端

我正在设计一个模拟器应用程序,其中应用程序启动到服务器的多个套接字连接(大约 1000 个连接)。我不想启动尽可能多的线程来处理这些连接,因为系统无法处理那么多客户端。使用 Select 没有意义,因为我需要遍历 1000 个可能很慢的连接。请建议我如何处理这种情况。