问题标签 [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.
c - tcp 消息通信
嗨,我想使用 tcp 连接来发送/接收消息。问题是我想发送许多消息并测量延迟。因此,我不想在发送每条消息后都收到。但是,如果我不及时处理传入的消息,程序总是会得到意想不到的结果。有什么方法可以处理 recv() 而不会阻止我的发送 msg 的程序?任何意见将不胜感激。
c - 处理多个 recv() 调用和所有可能的场景
我对 C 和编写 TCP 服务器相当陌生,并且想知道如何处理recv()
来自客户端的 s,客户端将发送服务器将响应的命令。为了这个问题,假设标题是第一个字节,命令标识符是第二个字节,有效载荷长度是第三个字节,然后是有效载荷(如果有的话)。
获取这些数据的最佳方法是什么recv()
?我正在考虑调用recv()
将前 3 个字节读入缓冲区,检查以确保标头和命令标识符有效,然后检查有效负载长度并recv()
以有效负载长度作为长度再次调用,并将其添加到上述缓冲区的后面。然而,阅读 Beej 的网络文章(特别是数据封装之子部分),他建议使用“一个足够大的数组容纳两个 [最大长度] 数据包”来处理诸如获取一些下一个数据包的情况。
处理这些类型的recv()
s 的最佳方法是什么?基本问题,但我想有效地实施它,处理所有可能出现的情况。提前致谢。
c++ - recv 有时接收到的不是全部数据
我有以下问题:这是代码块:
但有时recv
不返回整个数据(数据长度总是小于sizeof(temp)
),只返回它的一部分。写方总是向我发送整个数据(我用嗅探器得到它)。有什么关系?谢谢。
PS我知道,好的方式建议我检查n
(if (n < 0) perror ("error while receiving data")
),但现在没关系 - 这不是我的问题的原因。
PS2我忘记了——它阻塞了套接字。
sockets - epoll_wait() 接收到两次关闭的套接字(read()/recv() 返回 0)
我们有一个使用 epoll 来监听和处理 http-connections 的应用程序。有时 epoll_wait() 在“行”中两次接收 fd 上的关闭事件。含义:epoll_wait() 返回连接 fd,其中 read()/recv() 返回 0。这是一个问题,因为我将 malloc:ed 指针保存在 epoll_event 结构 (struct epoll_event.data.ptr) 中,并且在 fd 时释放(socket) 第一次被检测为关闭。第二次崩溃了。
这个问题在实际使用中很少发生(除了一个站点,实际上每台服务器大约有 500-1000 个用户)。我可以使用每秒超过 1000 个同时连接的 http siege 来复制问题。在这种情况下,应用程序段错误(由于指针无效)非常随机,有时在几秒钟后,通常在数十分钟后。我已经能够以每秒更少的连接数来复制该问题,但为此我必须运行该应用程序很长时间,很多天,甚至几周。
所有新的 accept() 连接 fd:s 都设置为非阻塞,并以一次性、边缘触发和等待 read() 可用的方式添加到 epoll。那么为什么当服务器负载很高时,epoll 认为我的应用程序没有获得关闭事件并排队新的?
epoll_wait() 在它自己的线程中运行,并将 fd 事件排队等待其他地方处理。我注意到有多个关闭传入简单代码,检查是否有从 epoll 到同一个 fd 的连续两次事件。它确实发生了,并且两者都关闭的事件(recv(..,MSG_PEEK)告诉我这个:))。
epoll fd 被创建:
p>epoll_wait() 运行如下:
p>在 accept() 之后将 new fd 设置为非阻塞:
新的 fd 被添加到 epoll(客户端是 malloc:ed struct 指针):
并且在接收和处理来自 fd 的数据后,它会重新武装(当然是从 EPOLLONESHOT 开始)。起初我没有使用边缘触发和非阻塞 io,但我对其进行了测试并使用它们获得了不错的性能提升。这个问题在添加它们之前就存在了。顺便提一句。shutdown(fd, SHUT_RDWR) 在其他线程上用于触发适当的关闭事件,以便在服务器由于某些 http 错误等需要关闭 fd 时通过 epoll 接收(我实际上不知道这是否是正确的方法这样做,但效果很好)。
c++ - 在 recv() 上 EAGAIN
我实现了一个套接字客户端,通过 HTTP 通过 RTSP 与 ip 摄像机通信,以从摄像机获取视频。
为了与相机建立通信,首先我必须设置一个 HTTP-GET 隧道,然后发送 RTSP 命令。当相机失去连接时,程序必须关闭隧道处理程序,结束线程,当进程返回主函数时,它开始通信(启动线程,等等)。
在重新连接时:http-get 隧道设置正常,我的意思是,套接字连接并接收“HTTP OK”,因此程序发送 RTSP“DESCRIBE”,但 recv 始终返回 EAGAIN 错误。我与 wireshar 核对 DESCRIBE OK 响应是从相机发送的,但 recv 从来没有得到它。
这是代码:
会不会是超时问题?还是堆栈问题?我该如何解决?
在此先感谢您的帮助。此致。
克里斯蒂娜
linux - EBADF while recv 在 epoll_wait 之后
我有以下问题:我有一个接收连接的 epoll 代码:
当我收到输入连接时,我试图读取所有 buff 数据:
功能内accept_request
。但有时我在调试输出中得到以下信息:
这意味着某人首先连接而不是断开连接,当他再次尝试连接时recv
返回EBADF
。我做错了什么?请帮我。
PSEPOLLRDHUP
我只是关闭文件描述符。epoll
man 说没关系,因为它会自行从队列epoll
中删除已关闭的 fd 。epoll_wait
c++ - HTTP keep-alive 与 C++ recv winsocket2
我正在编写自己的 HTTP 提取器套接字。我在 MVC++ 和 winsocket2.h 中使用 C++ 我能够对套接字进行编程以连接到所需网站的服务器并发送 HTTP GET 请求。
现在的问题是,在我使用 Keep-alive 连接发送 HTTP GET 请求后,我调用了 recv 函数,它工作正常,除了在检索网站后,它一直徘徊并等待来自服务器或连接的超时提示关闭!
根据服务器的保持活动超时,这需要几秒钟的时间,因此,我无法从保持活动的 HTTP 设置中受益。
如何在检索网站后告诉 recv 函数停止并将命令返回给我,以便我可以发送另一个 HTTP 请求,同时避免另一个握手机制。
当我使用非阻塞套接字时,它的工作速度更快,但我不知道什么时候停止,我设置了一个 str.rfind("",-1,7) 来停止检索数据。但是,它不是很有效。
有谁知道这样做的方法,或者当连接保持活动状态时 HTTP 服务器发送的最后一个字符是什么,所以我可以将其用作停止决定。
最好的,
萌
c - 调用 recvfrom 后套接字描述符已更改
编辑:删除代码/解释,因为这个项目已经再次给出,学生可以通过这篇文章轻松找到解决方案。
为了澄清发生了什么,我只是在我的 recvfrom() 调用中传递了错误的长度/大小。
c - recv 是否从 pcaps 缓冲区中删除数据包?
假设有两个程序在计算机上运行(为简化起见,只有在 linux 上运行的用户程序)一个调用 recv(),另一个使用 pcap 来检测传入的数据包。一个数据包到达,它被使用 pcap 的程序和使用 recv 的程序检测到。但是,是否有任何情况(例如,recv() 在调用 pcap_next() 之间返回)这两个中的一个不会得到数据包?
我真的不明白这里的缓冲系统是如何工作的,所以解释越详细越好 - 是否有任何可以想象的情况,其中一个程序会看到另一个没有的数据包?如果是这样,它是什么,我该如何预防?
c++ - 问题:recvmsg(pfd[0], &message, MSG_WAITALL) 总是返回-1 而不是被阻塞?
我正在制作一个服务器,它在连接时生成一个子进程(使用 fork),并在有另一个连接进入时使用管道向这个子进程发送另一个套接字。这个想法是让子进程在 2- 中管理两个连接玩家网络游戏模式。
父子之间的 IPC 管道变量是 pfd[2]。
基本上,在子进程中,我确实recvmsg(pfd[0], &message, MSG_WAITALL)
要等待从父进程传递的第二个套接字。
但是, recvmsg 永远不会被阻塞,并且总是返回 -1。
我已经将 pfd[0] 设置为 BLOCKING ,如下所示:
如何让孩子在 recvmsg 被阻止?
感谢一百万的任何提示。