- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用新设计的协议(protocol)实现一台服务器。根据协议(protocol),客户端发送 header 后跟数据。 header 包含元信息,包括数据大小。
我们提供示例客户端,但客户端程序也可以由第三方编写。因此,我们不能完全依赖 header 中提供的数据大小字段。
现在,我遇到了 recv()
系统调用的一个问题。
#define SOCKET_CHUNK_SIZE 4096
void * value;
1 value = (void *) malloc(hdr.size);
2 total_bytes_read = 0;
3 while(total_bytes_read < hdr.size) {
4 n = recv(newsockfd, value + total_bytes_read, SOCKET_CHUNK_SIZE, 0);
5
6 //fprintf(stderr, " %ld + %d = %ld\n", total_bytes_read, n, total_bytes_read + n);
7
8 total_bytes_read += n;
9
10 if(n == 0 || n < SOCKET_CHUNK_SIZE)
11 break;
12 if(n < 0)
13 send_error_response(newsockfd);
14 }
15
16 fprintf(stderr, "%ld", total_bytes_read);
这对于少量数据(如 9420 字节)非常有效,但对于大量数据则失败。
观察:
让客户端发送一些大数据,比如 604697 字节(hdr.size):
recv()
只能读取 65280 字节。即第 16 行的 fprintf 打印 65280。(我在我的机器上检查了 SSIZE_MAX,它是 2147483647,所以它比 SOCKET_CHUNK_SIZE 大得多)
我尝试在 recv()
调用中使用 MSG_DONTWAIT 标志,但结果是一样的。
我尝试使用 read()
系统调用代替 recv()
,结果是一样的。
当我取消对第 6 行的注释时,它工作得很好!! (但是这一行(和第 16 行)仅用于调试目的。我不能将其保留在最终版本中)
如果我在 recv()
中使用 MSG_WAITALL 标志,它会工作,但在读取最后一个 block 时会阻塞,因为最后一个 block 大小小于 SOCKET_CHUNK_SIZE (604697 = 147 * 4096 + 2585)。因此,我无法使用此标志,除非我依赖客户端 header 中提供的 size 并在 recv()
中进行更改。
客户端提供的数据也可以是二进制的,所以我们不能放置某种指示作为数据的结尾。
欢迎任何有想法/解决方案的人。正如我提到的,我们有解决方案 - 依赖客户端 header - 但只有在我找不到任何其他方法时我才会更喜欢它。
拉维
最佳答案
几乎所有的观察结果都可以完美解释:
因此,从我的角度来看,最好的办法是使用没有 MSG_WAITALL 标志的 recv 并接受小于 SOCKET_CHUNK_SIZE 的接收 block 。
关于c - recv()对于大量数据不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17647149/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!