- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - phát hiện rò rỉ bộ nhớ Ruby/Ruby on Rails
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
recv()
库函数手册页提到:
It returns the number of bytes received. It normally returns any data available, up to the requested amount, rather than waiting for receipt of the full amount requested.
如果我们使用阻塞式 recv()
调用并请求 100 个字节:
recv(sockDesc, buffer, size, 0); /* Where size is 100. */
服务器只发送 50 个字节,然后此 recv()
将被阻塞,直到有 100 个字节可用,否则它将返回接收 50 个字节。
场景可能是:
发送仅 50 字节后服务器崩溃
错误的协议(protocol)设计,其中服务器仅发送 50 个字节,而客户端期望 100 个字节并且服务器还在等待客户端的回复(即套接字关闭连接尚未由服务器启动,recv 将返回)
我对 Linux/Solaris 平台感兴趣。我没有开发环境,自己去查。
câu trả lời hay nhất
当内部缓冲区中有数据要返回时,recv 将返回。如果你请求100字节,它不会等到100字节。
如果您要发送 100 字节的“消息”,请记住 TCP 不提供消息,它只是一个流。如果您正在处理应用程序消息,则需要在应用程序层处理它,因为 TCP 不会这样做。
在许多情况下,当调用 recv(..., 100) 时,仅通过一次 recv 调用可能无法在另一端完全读取 100 字节的 send() 调用;这里只是一些几个ví dụ:
发送 TCP 堆栈决定将 15 个写入调用捆绑在一起,而 MTU 恰好是 1460,这取决于到达数据的时间可能会导致客户端前 14 个调用获取 100 个字节,然后第 15 个调用。调用以获取 60 个字节 - 最后 40 个字节将在您下次调用 recv() 时出现。 (但是,如果您使用缓冲区 100 调用 recv,您可能会获得前一个应用程序“消息”的最后 40 个字节和下一个消息的前 60 个字节)
发送端缓冲区已满,可能是读取端速度慢,或者网络拥塞。在某些时候,数据可能会通过,并且在清空缓冲区时最后一 block 数据不是 100 的倍数。
接收器缓冲区已满,而您的应用程序 recv() 数据时,它提取的最后一个 block 只是部分数据,因为该消息的整个 100 字节不适合缓冲区。
其中许多场景都很难测试,尤其是在您可能没有太多拥塞或数据包丢失的 LAN 上 - 当您提高和降低消息发送/生成的速度时,情况可能会有所不同。
无论如何。如果你想从一个套接字中读取 100 个字节,使用类似的东西
số nguyên
readn(int f, void *av, int n)
{
char *a;
int m, t;
a = av;
t = 0;
while(t < n){
m = read(f, a+t, n-t);
if(m <= 0){
if(t == 0)
trả về m;
phá vỡ;
}
t += m;
}
return t;
}
...
if(readn(mysocket,buffer,BUFFER_SZ) != BUFFER_SZ) {
//something really bad is going on.
}
关于阻止 recv() 返回少于请求字节的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2295737/
Như hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi mong đợi câu trả lời sẽ được hỗ trợ bởi các sự kiện, trích dẫn hoặc chuyên môn, nhưng câu hỏi có thể gây ra tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng. Nếu bạn cảm thấy vấn đề này có thể được cải thiện và có thể mở lại, hãy truy cập
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
Tôi là một lập trình viên xuất sắc, rất giỏi!