我已经声明了char data[101];
,然后从socket读取消息(服务器 - 客户端通信)。在屏幕上显示消息后,我想清除/清空该char数组。我尝试了memset(data, 0, sizeof(data))
和bzero(data, sizeof(data));
我认为它仍然没有明确。在收到第一条消息后的输出中,我也得到一些奇怪的字符: |V ,然后它们也会显示消息。现在我不知道那是来自客户端还是服务器端。我试图在两者上清除它,但结果没有任何不同。
这是我发送消息的方式:
char data[101];
read(0, data, 101);
dprintf(socket_fd, data);
bzero(data, sizeof(data));
答案 0 :(得分:1)
您展示的代码非常有问题:
char data[101];
read(0, data, 101);
dprintf(socket_fd, data);
它有三个主要问题:
您不会检查错误,这意味着如果read
调用失败,您将发送未初始化的数据。
您不会将输入作为字符串终止,这意味着您在发送时可能会超出范围。
如果输入包含printf
格式化序列,那么dprintf
将尝试读取不存在的参数,并且您将拥有未定义的行为(和一个非常大的安全漏洞。)
以下代码应修复以上所有内容:
char data[101]; // Place for a 100-character string, plus terminator
ssize_t bytes_read = read(STDIN_FILENO, data, sizeof(data) - 1); // -1 since we need space for terminator
// Make sure the read call went okay
if (bytes_read > 0)
{
// There was no error or end-of-file
data[bytes_read] = '\0'; // Terminate as a string
dprintf(socket_fd, "%s", data); // Send the data
}
在接收端,您当然需要在接收数据时添加错误检查,尝试接收比数据缓冲区大小更少的一个字节,并在打印之前终止数据缓冲区。
答案 1 :(得分:1)
这是另一种替代解决方案
//Declare and initialize to NUL characters.
char data[101] ="";
//fgets() will take care of out of boundary issue.
if (fgets(stdin, data, sizeof(data))
dprintf(socket_fd, "%s", data); // Send the data