gpt4 book ai didi

c - 如何在没有 eof 的情况下 recv 直到没有更多的 recv?

转载 作者:可可西里 更新时间:2023-11-01 02:55:11 30 4
gpt4 key购买 nike

所以我需要从服务器向客户端接收一个 html 文件,该文件比缓冲区大所以我发送了几次。这就是为什么我在接收时有这个循环

while (i = recv(s, buf, TAM_BUFFER, 0)) {
if (i == -1) {
perror(argv[0]);
fprintf(stderr, "%s: error reading result\n", argv[0]);
exit(1);
}
while (i < TAM_BUFFER) {
j = recv(s, &buf[i], TAM_BUFFER - i, 0);
if (j == -1) {
perror(argv[0]);
fprintf(stderr, "%s: error reading result\n", argv[0]);
exit(1);
}
i += j;
}
/* Print out the file line by line. */
printf("%s", buf);
}

发送看起来像这样:

while (fgets(buf, sizeof(buf), fp)){
if (send(s, buf, TAM_BUFFER, 0) != TAM_BUFFER) errout(hostname);
}

问题是循环永远不会结束,因为它没有接收到 eof 并且 i 永远不会为 0,它只是在那里保持阻塞状态。我无法关闭发送 eof,因为在他收到整个文件后,客户端会要求另一个文件。

如果循环保持阻塞超过 5 秒,我尝试发送 SIGALRM,但它没有按预期工作,因为循环不会停止,并且会抛出错误。

另外,我该怎么做才能接收到小于 TAM_BUFFER 的数据?(在发送中,更改 TAM_BUFFER -> strlen(buf))我知道我需要更改内部循环,但后来我遇到了同样的问题, j 永远不会为 0,所以我不知道如何结束它。(或者在这种情况下我可能不需要第二个循环)。

编辑:由于我遵循的协议(protocol),我无法发送文件的长度

最佳答案

TCP 是一种用于在每个方向上传输单个非结构化八位字节流的协议(protocol)。关闭连接(即 EOF)是 TCP 中向对等方发出信号表示此连接中将不再发送更多数据的唯一方式。如果您需要不同的方式,因为您需要区分同一 TCP 连接内的多个消息,那么您需要使用可以指定此类消息边界的应用程序级协议(protocol)。这通常通过固定消息大小、在消息前加上长度或特殊边界标记来完成。

关于c - 如何在没有 eof 的情况下 recv 直到没有更多的 recv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41198024/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com