当前位置: 首页 > 面试题库 >

阻止recv()返回小于请求字节的情况

翟誉
2023-03-14
问题内容

recv()库函数手册页提及的是:

它返回接收的字节数。它通常返回任何可用数据,直到请求的数量,而不是等待收到请求的全部数量。

如果我们使用阻塞recv()调用并要求100字节:

recv(sockDesc, buffer, size, 0); /* Where size is 100. */

服务器仅发送50个字节,然后将recv()其阻止,直到100个字节可用为止,否则它将返回接收50个字节。

情况可能是:

  • sendign仅50个字节后服务器崩溃

  • 错误的协议设计,其中服务器仅发送50个字节,而客户端期望100个字节,并且服务器还等待客户端的答复(即,套接字关闭连接尚未由recv将返回的服务器启动)

我对Linux / Solaris平台感兴趣。我没有开发环境可以自己检查。


问题答案:

当内部缓冲区中有数据要返回时,recv将返回。如果您请求100个字节,它不会等到100个字节为止。

如果要发送100字节的“消息”,请记住TCP不提供消息,它只是一个流。如果要处理应用程序消息,则需要在应用程序层进行处理,因为TCP不会这样做。

在许多情况下,调用recv(…,100)时,只有一个recv调用可能无法完全读取另一端的100字节send()调用;这里只是 几个 例子:

  • 发送TCP堆栈决定将15个写调用捆绑在一起,而MTU恰好是1460,这取决于到达数据的时间,可能导致客户端的前14个调用获取100个字节,而15个调用获取60个字节-最后的40个字节将在您下次调用recv()时出现。(但是,如果使用缓冲区100调用recv,则可能会获得前一个应用程序“消息”的后40个字节,以及下一条消息的前60个字节)

  • 发送者缓冲区已满,可能是读取器速度很慢,或者网络拥塞。在某些时候,数据可能会通过,在清空缓冲区时,最后一块数据不是100的倍数。

  • 接收器缓冲区已满,而您的应用程序recv()数据时,它拉出的最后一个块只是部分,因为该消息的整个100字节都不适合缓冲区。

这些场景中的许多场景都很难测试,尤其是在您可能没有很多拥塞或数据包丢失的局域网上-随着您提高/降低消息发送/生成速度的速度,情况可能会有所不同。

无论如何。如果要从套接字读取100字节,请使用类似

int
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)
                return m;
            break;
        }
        t += m;
    }
    return t;
}

if(readn(mysocket,buffer,BUFFER_SZ) != BUFFER_SZ) {
  //something really bad is going on.

}


 类似资料:
  • 问题内容: 因此,我有了这个Go http处理程序,该处理程序将一些POST内容存储到数据存储中,并检索其他一些信息作为响应。在后端,我使用: 在我的firefox OS应用程序中,我使用: 传入的部分都一直如此。但是,我的回复被阻止了。给我以下信息: 我尝试了许多其他操作,但是无法从服务器获得响应。但是,当我将Go POST方法更改为GET并通过浏览器访问该页面时,我得到的数据太糟糕了。我无法真

  • 问题内容: 是否可以使用angularjs拦截器阻止请求? 问题答案: 在1.1.5及更高版本中,您可以使用配置对象的’timeout’属性。 从文档中: 超时– {number | Promise} –超时(以毫秒为单位),或承诺应在解决后中止请求。 简单的例子:

  • 对localhost的Ajax请求返回403错误。然而,当我更改controller requestMethod以获取并在浏览器上打开请求“url”时,它会显示从服务器返回的json数据。我希望使用这些数据填充一个下拉列表。请帮帮我。我正在使用spring security 4.0和spring MVC框架。CSRF未禁用。此外,该url在Spring得到保护。 我在这里查看了相关问题,但没有找到

  • 问题内容: 我正在创建一个网站,该网站依赖于对PHP页面的AJAX调用。有没有办法防止访问原始数据?(即通过他们自己的帖子请求访问php文件)。 我想最好的方法(如果可能的话)是防止PHP将数据发送到不来自AJAX的任何内容(因为必须来自同一域)。有什么建议? 问题答案: if (strtolower($_SERVER[‘HTTP_X_REQUESTED_WITH’]) == ‘xmlhttpre

  • 每当我尝试使用axios发送删除endpoint的请求时,都会出现以下错误: 通过CORS策略阻止从源http://localhost:3000在http://localhost:8080/api/payment_card/delete/1234123412343433处访问XMLHttpRequest:对预检请求的响应未通过权限改造检查:请求的资源上不存在“Access-Control-Allo

  • 什么有效 我有一个简单的文字游戏。它工作得很好。用户要求的一件事是单词有效性检查。我正在AWS Lambda代理/节点上运行牛津字典api。jsendpoint,当我通过浏览器访问APIGateway uri时,效果非常好。 我选择AWS Lambda函数是为了保护我的Oxford API密匙,并且有更直接的CORS控制。 采取的步骤 我在AWS APIGateway中启用了CORS,并在开发过程