gpt4 book ai didi

c - 在 ARM 上发送返回 29200

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:08 27 4
gpt4 key购买 nike

我正在使用 c 程序来响应 API 调用。我想用 JSON 回复。我创建了一个监听端口的流式套接字,并使用浏览器(在我的例子中是 firefox)创建了一个 GET 请求。然后我根据收到的请求使用“发送”方法回复。

问题是当我的回复大于 29200 字节时。然后send方法返回29200,只发送前29200个字节,然后就停止了。我不明白为什么它会停在这个数字上。

我试过谷歌,发现: C++ socket programming Max size of TCP/IP socket Buffer?

我的套接字是阻塞的,所以 send() 函数应该阻塞,直到发送完所有数据。

我也试图找出 linux 是否阻止任何东西,但是当我检查时(不确定我是如何检查的,找不到描述这个的 stackoverflow 问题)它被设置为大于 29200 的东西。

我想知道为什么我的套接字停在 29200,如果可能的话,我该如何更改套接字以使其发送更多数据?

编辑:

做了一些测试,结果如下:

创建了一个测试程序来发送回 29999 字节的数据:https://pastebin.ca/4010317

我正在使用 curl 接收数据 curl -X GET -i 'http://:12345'

在我的电脑上运行时,响应是:

received: -1 bytes
received:
sent 29999 bytes

我可以看到在我的计算机 (x64) 上接收不起作用,但发送起作用(Curl 确实接收到数据)

但是在 ARM 设备上运行时响应是:

received: 83 bytes
received: GET / HTTP/1.1
Host: 192.168.1.118:12345
User-Agent: curl/7.47.0
Accept: */*

J
sent 29200 bytes

这里,curl 接收到 29200 字节的数据。

当尝试循环发送(https://pastebin.ca/4010318)时,结果是:

received: -1 bytes
received:
sent 29199 bytes

这里curl接收到29200字节,第二次发送返回-1。所以循环是不可能的。

我会继续努力,但感谢您的帮助。

最佳答案

您的代码有效。好吧,更确切地说,尽管有许多小的误用功能,它仍然有效。

首先,我问你一个 mvce:你给了一个代码,其中有一些无用的代码行,只会增加复杂性:如果你不需要客户端连接上的信息,你可以传递 NULL 来接受。

accept4(socketId, NULL, NULL, SOCK_NONBLOCK);

这样,我们就没有 2 个无用的变量。

其次:检查错误很酷,但显示某些内容(或日志记录)更好,因为您可以提示为什么这不起作用。

例如,您解释为非工作的“接收:-1 字节”实际上是工作的:错误 (errno) 是 EAGAIN,这意味着由于您的套接字是非阻塞的,因此数据当前不可用所以你必须循环你的 recv 来读取传入的数据。循环接收将“解决”你的错误问题。

最后:不,你也不会循环发送:你只是检测你是否没有发送所有数据并再试一次:做一个LOOP!

编辑:

您可以看到我如何为“检查错误和日志记录”部分执行“initServerSocket”函数:

int InitServerSocket(int portNum, int nbClientMax)
{
int socketId = -1;
struct sockaddr_in addressInfo;
int returnFunction = -1;

if ((socketId = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
// Log !
goto END_FUNCTION;
}

addressInfo.sin_family = AF_INET;
addressInfo.sin_addr.s_addr = htonl(INADDR_ANY);
addressInfo.sin_port = htons(portNum);
if (bind(socketId, (struct sockaddr *)&addressInfo, sizeof(addressInfo)) == -1) {
// Log !
goto END_FUNCTION;
}

const int flags = fcntl(socketId, F_GETFL, 0);
fcntl(socketId, F_SETFL, flags ^ O_NONBLOCK);
// Error detection & log ?


if (listen(socketId, nbClientMax) == -1) {
// Log !
goto END_FUNCTION;
}


returnFunction = socketId;
socketId = -1;
/* GOTO */END_FUNCTION:
if (socketId != -1) {
close(socketId);
}

return (returnFunction);
}

关于c - 在 ARM 上发送返回 29200,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49571963/

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