gpt4 book ai didi

c - 如何解决recv将多个TCP段合并为一个的问题?

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

我有两个同伴:Alice 和 Bob。 Bob 正在尝试向 Alice 发送他所认识的对等点列表。

首先,Bob 告诉 Alice 他有多少个对等点,然后他将包含有关对等点信息的 n 个字符串发送给 Alice。

这是 Bob 的代码:

if ((send(socket_fd, &(int){ 1 }, sizeof(int), 0)) == -1) { perror("Failed to send"); }
sleep(1); // Give him time to process the rqst

send(socket_fd, &peer_cnt, sizeof(peer_cnt), 0);
for (int i = 0; i < peer_cnt; ++i) {
char *peer_str = get_string(&peers[i]);
printf("Send peer\t:\t%s\n", peer_str);
send(socket_fd, peer_str, strlen(peer_str), 0);
free(peer_str);
}

这是 Alice 的代码:

char buf[128] = { 0 };
int n = 0;
recv(peer_sock_fd, &n, sizeof(n), 0);
printf("Number of incoming peers:\t%d\n", n);

for (int i = 0; i < n; ++i) {
memset(buf, '\0', sizeof(buf));
recv(peer_sock_fd, buf, sizeof(buf), 0);
puts(buf);
}

示例。如果 Bob 发送 Alice 2 字符串,则存在两种情况。首先,爱丽丝分别获取它们(正如我的意图),例如在这种情况下,Alice 的输出可能是 george:127.0.0.1:5555:michael:127.0.0.1:4444:。其次,Alice 将它们作为单个字符串获取,如下所示 george:127.0.0.1:5555:michael:127.0.0.1:4444:

为什么传入的字符串有时会合并?

最佳答案

TCP 是一种流协议(protocol),当您调用 send() 时,它会将您的消息一个接一个地放入一个特殊的缓冲区中,然后发送它们。由于您在很短的时间内调用多个 send() 系统调用,因此许多系统调用会被放入同一缓冲区中并作为一条消息发送。有时它们会单独发送,有时会合并,有时只会发送一半消息,这是流协议(protocol)的默认行为。你应该做的(这就是每个像样的 TCP 程序的实现方式)是分隔你的消息。最好的方法是将消息大小整数作为每个消息的前 4 个字节,然后根据消息的大小分隔消息。我建议您阅读 Beej 的套接字指南 (https://beej.us/guide/bgnet/html/multi/index.html),它解释了这个概念以及更多内容。非常适合初学者

关于c - 如何解决recv将多个TCP段合并为一个的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55324469/

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