gpt4 book ai didi

c - 在 TCP 中发送/处理部分数据写入

转载 作者:行者123 更新时间:2023-11-30 14:20:28 25 4
gpt4 key购买 nike

因此,我有以下代码,可以通过 TCP 发送数据包。它工作得很好。我只需要测试部分写入。因此,我通过将 sendbuf 设置为 1 来一次写入 1 个字节,或者进行如下所示的修改。当我进行 tcpdump 时,除了第一个字节之外,一切都不正确。我做错了什么?

int tmi_transmit_packet(struct tmi_msg_pdu *tmi_pkt, int len, int *written_len)
{
int bytes;

// This works
bytes = write(g_tmi_mgr->tmi_conn_fd, (void*) tmi_pkt, len);

// This doesn't:
// bytes = write(g_tmi_mgr->tmi_conn_fd, (void*) tmi_pkt, 1);

if (bytes < 0) {
if (errno == EAGAIN) {
return (TMI_SOCK_FULL);
}
return (TMI_WRITE_FAILED);
} else if (bytes < len) {
*written_len += bytes;
tmi_pkt += bytes;
return (tmi_transmit_packet(tmi_pkt, len - bytes, written_len));
} else {
*written_len += len;
}
return TMI_SUCCESS;
}

最佳答案

这一行

tmi_pkt += bytes;

很可能没有达到您的预期。

它确实增加 tmi_pkt通过sizeof(*tmp_pkt) * bytes不仅是bytes 。有关指针算术的详细解释,您可能会喜欢 click here and have a look at binky .

要解决这个问题,您可以按如下方式修改代码:

...
else if (bytes < len) {
void * pv = ((char *) tmp_pkt) + bytes;
*written_len += bytes;
return (tmi_transmit_packet(pv, len - bytes, written_len));
}
...

无论如何,这有点脏,因为传递到写入函数的指针指向的数据不一定需要与其类型相对应。

因此,更干净的解决方案是不使用 struct tmi_msg_pdu *tmi_pkt但是void *char *作为函数参数声明。

尽管这里使用递归调用有点奢侈,但没有必要也不推荐。对于大量数据和/或缓慢传输,可能会耗尽堆栈内存。一个简单的循环也可以。后者的优点是您可以使用指向要写入的缓冲区的临时指针,并且可以坚持类型化接口(interface)。

关于c - 在 TCP 中发送/处理部分数据写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15426630/

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