gpt4 book ai didi

c - 如何使用小缓冲区将格式化字符串发送到套接字?

转载 作者:太空狗 更新时间:2023-10-29 16:01:52 26 4
gpt4 key购买 nike

我正在尝试将一些 xml 数据写入 C 中的套接字。我可以使用以下方法将 xml 字符串打印到屏幕上:

printf("<tag1>%d</tag1>"
"<tag2>%s</tag2>"
"<tag3>%s</tag3>"
"<tag4>%d</tag4>",
int1,
str2,
str3,
int4);

我尝试将字符串snprintf 打印到缓冲区 (char[]),而不是打印到标准输出,然后将缓冲区的内容写入套接字。不幸的是,我想这里的缓冲区可能在写入 str2str3 期间已满,甚至可能不够大以包含任何一个字符串。

使用 snprintf 可以很容易地检查我是否能够将所有数据写入缓冲区,但在将缓冲区内容发送到套接字后要从中断处继续操作并不容易。

基本上:如果格式化的字符串长于64 字节?

如果此功能不存在,我对您建议的解决方法感兴趣(如果有帮助,您可以假设 %s 字段由试图溢出您的恶意机器人填充缓冲区,无论大小)。

最佳答案

在 Linux 上至少有 GNU libc你可以使用 asprintf(3) (它给出了一个 malloc-ed 字符串)或 dprintf(3) (打印到文件描述符中)。

你也可以(更便携)fdopen(3)然后是套接字文件描述符 fprintf(3) fflush(3) 它。您可以使用 setvbuf(3) 配置缓冲.

fileno(3)也很有用...

顺便说一句,snprintf(3)正在返回需要的 字节数。所以你可能会编码

char tinybuf[100];
char* buf = tinybuf;
int nbytes= snprintf(tinybuf, sizeof(tinybuf),
"<tag at='%d'>%s</tag>", num, string);
if (nbytes >= sizeof(tinybuf)) { // rarely happens
char *buf = malloc(nbytes+1);
if (!buf) { perror("malloc"); abort(); };
snprintf(buf, nbytes+1,
"<tag at='%d'>%s</tag>", num, string);
};
int off=0;
while (nbytes>0) {
int nbw=write(sock, buf+off, nbytes);
if (nbw>0) { off += nbw; nbytes -= nbw; };
else if (nbw<0 && errno != EINTR) { perror("write"); abort(); };
};
if (buf != tinybuf) free(buf);

tinybuf 适合的常见情况下,这将避免 mallocfree...

关于c - 如何使用小缓冲区将格式化字符串发送到套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20981736/

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