gpt4 book ai didi

c - 套接字数据长度问题

转载 作者:太空狗 更新时间:2023-10-29 11:24:09 24 4
gpt4 key购买 nike

我有几个与以下代码相关的问题:

char buffer[256];
memset(buffer,0,256);

read(socket_fd,buffer,255);

问题:

  1. 为什么我读的是 255 而不是 256?
  2. 假设我想从客户端向服务器发送单词:“Cool”。我应该“在客户端”写入多少字节以及“在服务器端”读取多少字节?

我真的很困惑。

最佳答案

您在这里已经有了很好的答案,但我认为我们应该解释一个概念。

当您通过流发送数据时(即,从一端写入多个字节,而这些字节可以在另一端以相同的顺序读取),您几乎总是想知道何时停止读取.如果您要发送不止一件事,这是强制性的:第一条消息何时停止,第二条消息何时开始?在流中,事情变得困惑。

那么,我们如何分隔消息呢?共有三种简单的方法(当然还有许多其他不那么简单的方法):

1 条固定长度的消息:如果您事先知道每条消息的长度都是 10 个字节,那么您就没有问题。你只读了 10 个字节,第 11 个字节将成为另一条消息的一部分。这很简单,但也很死板。

2 定界字符,或字符串:如果您要发送人类可读的文本,您可以像在 char* 中分隔字符串一样分隔消息:在末尾放置一个 0 字符。这样,当您读取 0 时,您就知道消息已结束并且流中的任何剩余数据都属于另一条消息。

这对于 ascii 文本没问题,但是当涉及到任意数据时,它也有些死板:有一个字符或一系列字符,您的消息不能包含(或者您的程序会混淆其中消息结束)。

3 邮件标题:这是处理任意长度、任意内容消息的最佳方法。在发送任何实际的消息数据之前,发送一个固定长度的 header (或使用技术 nr 2 来标记 header 的结尾),指定有关您的消息的元数据。例如,它的长度。

假设您想像您所说的那样发送消息“Cool”。那么,首先发送一个字节(或一个 2 字节的短整数,或一个 4 字节的整数),其中包含消息的长度“4”,并在另一端接收它。您知道在任何消息到达之前,您必须读取 1 个字节,将其存储在某处,然后读取剩余的指定字节。

一个简化的例子:

struct mheader {
int length;
}

// (...)

struct mheader in_h;
read(fd, &in_h, sizeof(struct mheader);

if (in_h.length > 0) {
read(fd, buffer, in_h.length)
}

在实际使用中,请记住read 并不总是读取您请求的确切字节数。检查返回值以找出(可能为负值以指示错误),并在必要时再次读取

希望这对您有所帮助。祝你好运!

关于c - 套接字数据长度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4187010/

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