问题标签 [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 - 您将如何接收使用“sendfile”发送的文件?
我正在尝试实现一个基本的文件服务器。我一直在尝试使用此处找到的 sendfile 命令:http: //linux.die.net/man/2/sendfile我正在使用 TCP。
我可以让它很好地发送,但它以二进制发送,我不确定这是否是挂断。
我正在尝试使用 recv 接收文件,但它没有正确通过。有没有一种特殊的方法来接收二进制文件并将其放入字符串中?
编辑:被要求提供一些代码,这里是:
SENDFILE 调用(来自服务器进程)
RECIEVE 调用(来自客户端进程,比循环更基本,只需要一个字母)
编辑:写了一些代码来检查返回值。sendfile 给出 errno 9 - 错误文件号。我假设这是我在调用中的第二个文件描述符(我正在发送的文件的那个)。我将其转换为 int 是因为 sendfile 抱怨它不是 int。
鉴于我在上面的 sendfile 调用中使用的文件指针代码,我应该如何使用发送文件?
http - 使用伯克利套接字的未知大小的 recv() 数据
我有一个 C++ 代码,其中我使用 Berkeley Sockets 的 recv() 从远程主机接收数据。问题是我不知道数据的大小(它是可变的),所以我需要某种超时选项(可能)来完成这项工作。
由于我是套接字编程的新手,我想知道例如 Web 客户端如何处理来自服务器的响应(例如,服务器将 html 数据发送到客户端)。它是否使用某种超时,因为它不知道页面有多大?与 FTP 客户端相同。
c - recv() 延迟
我有两个使用套接字编程进行通信的程序。最初,我将指定编号。关于他们必须在彼此之间交换消息的时间的跳数。每次它收到一条消息时,它都会将它的 id 附加到它上面。因此,字符串每次都会变大。我的程序在 8000 跳时运行良好,但是在超过 8000 跳之后,虽然程序 p1 发送了一个长度为 16388 的字符串,但 p2 确定套接字中只有 16385 可以读取。我使用 ioctl() 来确定套接字中准备接受 recv() 的字符数量,然后在 char * 变量中接收它...
是否因为 p1 中的 send() 和 p2 中的 recv() 存在延迟,所以 p2 仅识别套接字中的 16385 个字符?
例如:如果 P1 发送长度(16388)
P2 仅接收以下长度(16385)
sockets - 我是否需要轮询非阻塞套接字以获得更好的性能?
我有一个非阻塞套接字列表。
我可以调用recv
每一个(在这种情况下,一些调用会失败)或poll
列表,然后调用recv
准备好的套接字。
这些方法之间是否存在性能差异?
谢谢!
c - socket.h 的 recv() 上的分段错误
执行 .recv() 函数时出现奇怪的分段错误。这是我的代码中使用的函数 recv() 。
这个问题最奇怪的部分是分段错误并非每次都发生。通常在接收 100 或 200 次后(或偶尔更少)。而当它发生时,程序只会输出我的“start recv()”句子而没有“end recv()”。
所以我认为问题发生在 recv() 函数中,但我无法弄清楚为什么以及如何解决这个问题。
linux - TCP 消息帧 + recv() [linux]:好的约定?
我正在尝试在 Linux 上创建一个 p2p 应用程序,我希望它尽可能高效地运行。
我遇到的问题是管理数据包。众所周知,在任何时候,recv() 缓冲区中都可能有多个数据包,因此需要某种消息帧系统来确保多个数据包不会被视为一个大数据包。
所以目前我的数据包结构是:
这需要两次调用 recv(); 一个获取数据包大小,一个获取数据包。
这有两个主要问题:
为了获得最佳效率和稳定性,构建数据包/接收系统的最佳方法是什么?其他应用程序是如何做到的?你有什么建议吗?
先感谢您。
c++ - WinSock2:使用 recv 和 send 在单独的线程中处理接受的传入连接
我正在实现一个基于 Windows 的 Web 服务器,它使用WinSock2处理来自客户端的多个特定 HTTP 请求。我有一门课来启动和停止我的服务器。它看起来像这样:
whereTLM_ERROR
是我的服务器错误枚举的类型定义。
bool CMyServer::Start()
方法启动服务器,在配置的端口上创建一个套接字侦听并创建一个单独的线程DWORD CMyServer::Run(LPVOID)
来接受传入连接,如下所述:
I use ::accept(...)
to wait for incoming client connections in CMyServer::Run(LPVOID)
, and after new connection has been accepted I create a separate thread CMyServer::ProcessRequest(LPVOID)
to receive a data from a client and send a response passing the socket returned by ::accept(...)
as part of thread function's argument:
Testing this implementation manually gives me the desired results. But when I send multiple requests generated by JMeter I can see that some of them are not handled properly by DWORD CMyServer::ProcessRequest(LPVOID)
. Looking at log file created by ProcessRequest
I determine 10038 WinSock error code (meaning that ::recv
call was tried on nonsocket), 10053 error code (Software caused connection abort) or even 10058 error code (Cannot send after socket shutdown). But the 10038th error occurs more often than others mentioned.
It looks like a socket was closed somehow but I close it only after ::recv
and ::send
have been called in ProcessRequest
. I also thought that it can be an issue related to using ::CreateThread instead of ::_beginthreadex but as I can get it could only lead to memory leaks. I don't have any memory leaks detected by the method described here so I have doubts that it is the reason. All the more, ::CreateThread
returns a handle that can be used in ::WaitForMultipleObjects to wait for threads to be over, and I need it to stop my server properly.
Could these errors occur due to a client doesn't want to wait for response anymore? I am out of ideas, and I will thank you if you tell me what I am missing or doing/understanding wrong. By the way, both my server and JMeter run on the localhost.
Finally, here is my implementation of ProcessRequest
method:
c - 线程中的套接字接收,错误的行为
问候!
我在 linux 中使用 unpv13e 库作为套接字服务器开发,并监听一个将接受 3 个套接字客户端(最多)的端口,每个客户端都有自己的线程....
虽然这 3 个客户端发送速度非常快,但套接字服务器的 recv 函数将接收到一半来自客户端 1 的字符串,另一半来自客户端 2,这很奇怪,因为我认为这 3 个套接字客户端将在不同的线程中运行,也不同的socket id,所以我很好奇为什么会这样?让我在下面的代码中解释一下:
unpv13e 库中的 readline 函数调用 recv ,一次检查一个字符,直到它是一个 '\n' 并返回,nread 通常是 315 字节左右,我在这个套接字服务器中没有发送!在我看来,web_child 函数作为线程运行,具有不同的 socketfd,并且 line 是本地 var,因此 3 个不同的客户端不会相互影响,socket client1 将始终发送以 "101" 开头的字符串,而 client2 始终发送“201”,客户端3发送“301” ....
但有时我会在 Do101(line) 中看到一个字符串,它的前半部分是 "101" ,后半部分来自 client2 ,它们只是相互影响......如果这 3 个客户端发送非常非常频繁,它可能会发生......不是很频繁,但它只是发生了!
我在代码中有什么样的错误?来自不同线程中不同socketid的recv会相互影响吗?
欢迎任何建议!谢谢 !!
c++ - winsock - recv - 网络连接问题
在我的 C++ 应用程序中,我recv
在循环中使用该函数。我想通过从 recv 函数中获取负值来识别网络连接问题。
我在测试中可以看到的一件事是,当我断开网络电缆时,我可以等待 ~ 分钟,直到我看到我的应用程序得到了这个负值。
您知道 C++ 代码知道网络连接问题发生的持续时间是多少吗?我可以管理这个时间吗?
c++ - 基于 TCP 的 C++ 函数
我正在使用 recv 函数(C++)来获取有关网络问题的指示(在这种情况下它返回负值)
看这里:https ://www.rfc-editor.org/rfc/rfc1122#page-100在 TCP Connection Failures,我看到有 R1 和 R2。
R1 是 TCP 通知应用程序存在问题的时间。R2 是连接关闭的时候。
“在当前 RTO,R1 的值应该对应于至少 3 次重传。R2 的值应该至少对应 100 秒。”</p>
RTO(重新传输超时)通常从 3 秒开始,因此对于 R1,它可能在大约 10 秒之后。
据我了解,接收功能会让我了解 R2。你知道在 C++ 应用程序中获取 R1 的方法吗?
10 倍。