该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
我有一个Android、Ios和web应用程序,它使用php作为后端。所有Api在android和ios中都运行良好,但在web中抛出CORS错误。得到这样的错误 访问位于“”的XMLHttpRequesthttps://example.com/api“起源”http://localhost:49168'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origi
每当我尝试使用axios发送删除endpoint的请求时,都会出现以下错误: 通过CORS策略阻止从源http://localhost:3000在http://localhost:8080/api/payment_card/delete/1234123412343433处访问XMLHttpRequest:对预检请求的响应未通过权限改造检查:请求的资源上不存在“Access-Control-Allo