问题标签 [recv]

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 投票
2 回答
1121 浏览

http - 为什么 recv() 在除第一个循环之外的所有 for 循环迭代中都返回 '0' 字节?

我正在用 C++ 编写一个小型网络程序。除其他事项外,它还必须下载 Twitter 个人资料图片。我有一个 URL 列表 (stl::vector)。而且我认为我的下一步是创建for循环并通过套接字发送GET消息并将图片保存到不同的png文件中。问题是当我发送第一条消息,接收答案片段并保存 png 数据时,一切似乎都很好。但是在下一次迭代中,通过同一个套接字发送的相同消息通过 recv() 函数产生 0 个接收字节。我通过向循环体添加套接字创建代码解决了这个问题,但我对套接字概念有点困惑。看起来当我发送消息时,应该关闭套接字并重新创建以将下一条消息发送到同一台服务器(以获取下一张图像)。这是正确的插座方式吗?

提前致谢。

UPD:这是我创建套接字的循环代码。

0 投票
2 回答
2068 浏览

linux - linux recv() 函数标志参数?

如果我recv(sockfd, buffer, len, 0);在非阻塞套接字上使用会发生什么?

如果套接字sockfd已关闭或没有可读取的内容,是否recv()阻塞?(注意:中的标志recv ()0)。

0 投票
1 回答
229 浏览

c++ - 服务器守护进程的套接字停止工作

我有一个绑定两个端口的应用程序:6961 和 6963。它是客户端-服务器-客户端形式的应用程序,其中一个客户端控制另一个客户端。

该应用程序运行良好,但在看似随机数量的接受和关闭连接之后,服务器拒绝通过套接字接收或发送数据。我可以与 建立联系telnet,但是当我输入内容时,我没有得到回复。

我曾经有几次服务器最多接受 370 个连接,直到它拒绝工作,但上次它只接受 70 个连接。

我认为这与关闭套接字无关,我认为我做得很好。这是我启动应用程序时的输出netstatlsof但我真的不知道如何解释它们。我只是在谷歌搜索时发现了这些。

这是服务器停止接受时两个命令的输出:

我不知道从哪里开始寻找错误。

0 投票
4 回答
3008 浏览

c++ - 使用 Winsock 的 send()/recv() 时是否需要确认响应?

使用 Winsock、C++,我使用send()/recv()和 TCP 连接发送和接收数据。我想确定数据是否已经传递给对方,并且想知道是否建议在(如果)使用recv接收数据之后发回一些确认消息。

这里有两种可能性,请建议走哪条路:

  1. 如果send返回传递缓冲区的大小,则假定数据至少已传递到线路另一端的recv函数。当我说“至少”时,我的意思是即使recv在那里失败(例如由于缓冲区不足等),我不在乎,我只是想确保我已经正确完成了我的服务器部分工作 -我已经完全发送了数据(即数据到达了另一台机器)。

  2. 使用附加确认:在使用recv接收到数据后,发回接收到的数据包的一些 ID(发送的每个数据的标头的一部分),表明该数据包的成功接收操作。如果在一段时间后我没有收到这样的“确认消息”,请从发件人函数返回失败代码。

第二个答案看起来更安全,但如果它是多余的,我不想使传输协议复杂化。另请注意,我说的是 TCP 连接(它本身比 UDP 更安全)。

是否有任何其他机制(可能是其他一些 API?也许WSARecv()/WSASend()工作方式不同?)确保数据被传递到另一端的recv函数?

如果您推荐第二种方式,您能否给我一些代码片段,让我可以使用带有超时的recv来接收确认?recv是一个阻塞操作,因此如果之前的发送尝试失败(未通知对方),它将永远挂起。是否有任何简单的方法可以使用带有超时的recv(无需每次都创建单独的线程,这可能是每个发送操作的过度杀伤力)。

此外,我传递给发送函数的数据量可能非常大(几兆字节),那么如何选择“确认消息”的超时时间?也许我应该“拆分”大缓冲区并使用多个发送调用?我觉得会很复杂,请指教!

编辑:好的,你们建议 TCP/IP 堆栈将处理它(即不需要手动确认),但这是我在 MSDN 页面上找到的:“发送功能的成功完成并不表示数据成功发送和接收到收件人。此功能仅表示数据已成功发送。因此,即使 TCP 机制有能力确保数据传递,我也无法通过send()函数或我知道的任何其他 Winsock 函数获得该状态(成功与否)。您知道从 TCP 层获取状态的任何方法吗?再次 - send()函数的返回值似乎还不够!

==================================================== ======

编辑 2:好的,我认为我们同意即使 TCP 协议在出现问题时考虑错误处理,Winsock 的send()函数也无法报告错误(仅仅是因为它在实际数据传输开始之前返回网络驱动程序)。所以这里有一个百万美元的问题:Winsock 的send()函数是否至少确保在当前数据包发送之前不会有其他数据包被传递给对方?换句话说,如果由于某些网络故障(但没有通过send()调用报告)发送失败,那么网络故障将在下一次调用send()函数和下一个数据块之前修复,是否可以确保前一个数据包(失败但未报告send() ) 将在下一个数据包之前交付吗?换句话说,一个特定的 send() 函数是否有可能“静默”失败,以便后续的 send() 调用会成功但第一个数据包会丢失?再次 - 我不是在说 TCP 级别,我说的是 Winsock API 级别!

0 投票
2 回答
2434 浏览

multithreading - 如何将单个端口用于多个逻辑数据流(Winsock)?

我正在开发客户端-服务器 Winsock 应用程序 (Visual C++),它应该通过网络传输各种数据(视频流、音频流、服务通知等)。我知道更简洁的方法是为每个单独的数据类型在单独的线程上使用单独的端口(我在这里称之为“流”)。但这需要占用至少 5 个不同的端口,这对于某些网络基础设施(防火墙端口转发等)会产生问题。

所以我正在尝试实现单端口连接(TCP),只有一个套接字用于传输不同的流。单个数据包将在标头中包含信息,该信息将表示它属于哪个流、预期的总消息大小等。假设我有 5 个不同的流。我打算使用 5 个线程来调用同一个套接字的send()。这安全吗?我知道来自不同流的数据包会混合到达,但如果我在每个发送的数据包中包含必要的元信息,它可以在另一端正确重建,对吧?

但真正的问题是接收端。虽然从同一个套接字上的多个线程调用send()可能是可以的(尽管我不确定并且需要您的确认!),但从多个线程调用recv()没有多大意义。所以我应该从一个线程使用一个阻塞recv() 。但是,然后,根据数据包标头(识别特定数据包属于哪个流),我应该在不同的线程中分叉处理。视频流应该由一个线程处理,声音流 - 由另一个线程处理,等等。但我不太清楚如何做到这一点 - 如何从接收线程分叉数据处理。性能是重中之重,因此不能考虑通过一个线程处理所有流。

所以总结一下,我有三个问题:

  • 可以从多个线程为同一个套接字调用send()吗?(假设数据包头中有关于它属于哪个发送者线程(即子系统)的信息)。
  • 在接收端有一个阻塞套接字,从单个线程循环调用recv() ,如何将不同逻辑流的接收数据包“分叉”到不同的工作线程?
  • 对于通过一个端口实现多流传输,您还有什么建议?

PS:Afaik,没有办法通过多个套接字使用一个端口,对吗?

它是 Windows 平台、Winsock2、Visual C++(如果你能提供特定于平台的提示,那就太好了)。

= 更新 =

  • 当您说“锁定套接字”时,您的意思是序列化对send()函数的访问?例如与关键部分

  • 至于接收端......我想我会在recv()循环时组装消息(我称“消息”为逻辑完整的数据结构,例如视频帧或声音样本等)(缓冲来自单独的流进入单独的缓冲区),然后我只是将组装的消息(当一个将被完全接收时)传递给分叉线程。现在这就是问题 - 如何通过它们。我想到的一种方法是事件对象:来自接收线程的SetEvent()来触发WaitForSingleObject()(在某个循环中)在不同的线程中。你能建议这是否是可接受的解决方案吗?你能提出更好的建议吗?没有比事件对象更快的解决方案(“触发”同一应用程序的另一个线程)吗?以及如何传递数据?

0 投票
2 回答
269 浏览

sockets - 套接字:服务器关闭时客户端退出且没有任何返回

我正在制作一个简单的客户端/服务器 TCP 通信流,我的问题是当我终止服务器应用程序时,客户端应用程序只是优雅地退出。STDERR 没有输出,recv() 不返回 0 或 -1,客户端应用程序只是停止。

另一方面,如果我终止客户端应用程序,服务器应用程序会从 send() 获得返回值 0,这是预期的。

非常感谢您对此问题的任何帮助!

0 投票
2 回答
652 浏览

python - Python tcp 发送接收函数

在 python 中,recv 是否是阻塞函数?我是在 Uni C 中学习的,那里有阻塞和非阻塞套接字。所以我只是想在 python 中询问天气,recv 函数是否是阻塞函数。

0 投票
4 回答
13383 浏览

c - 套接字关闭时取消阻止 recvfrom

假设我启动一个线程以在端口上接收。套接字调用将在 recvfrom 上阻塞。然后,不知何故在另一个线程中,我关闭了套接字。

在 Windows 上,这将解除对 recvfrom 的阻止,并且我的线程执行将终止。

在 Linux 上,这不会解除对 recvfrom 的阻塞,因此,我的线程永远不会做任何事情,并且线程执行不会终止。

任何人都可以帮助我了解 Linux 上发生的事情吗?当套接字关闭时,我希望 recvfrom 解除阻塞

我一直在阅读有关使用 select() 的信息,但我不知道如何在我的特定情况下使用它。

0 投票
3 回答
4077 浏览

c++ - BSD 套接字 - 使用 send 和 recv

我正在尝试使用 bsd 套接字在 linux 中实现一个简单的聊天程序。现在我只是想从客户端向服务器发送和接收一条消息。每当我运行代码时,recv 返回 -1 并且 errno 代码为 22。

服务器代码 -

客户端代码 -

即使我在服务器端收到错误,我也没有在客户端收到错误消息 - 它只是正常退出。

根据-http: //www.workers.com.br/manuais/53/html/tcp53/mu/mu-7.htm errno 22 错误消息仅表示“无效参数”。但我不知道如何准确解释……如果一个论点无效,为什么它还要编译?

如果有人能指出我在这里做错了什么,我将不胜感激。欢迎您指出任何其他小笔记。谢谢你的帮助。

0 投票
2 回答
19109 浏览

timeout - recv() windows socket 需要无限时间 - 如何超时?

我使用文件描述符来查找可读的套接字并继续阅读。由于某些原因,在线路上没有数据的套接字继续读取并且永远不会返回。有没有办法可以在超时后退出接收?

我正在使用winsock库..