AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 680406
Accepted
Mr Krisey
Mr Krisey
Asked: 2021-12-07 09:36:34 +0800 CST2021-12-07 09:36:34 +0800 CST 2021-12-07 09:36:34 +0800 CST

socat:EXEC 没有正确中继

  • 772

我有一个小程序,它首先向用户输出一个字符串,然后接受一个输入。相反,我希望程序通过从端口发送和接收来工作。为了尝试实现这一点,我运行了命令socat TCP4-LISTEN:1337,reuseaddr,fork EXEC:./program。通过这个命令,我希望能够运行nc 127.0.0.1 1337并期望程序:

  1. 接收来自程序的消息
  2. 能够提供输入
  3. 失去联系

但是,当使用socat它运行程序时,就像这样

  1. 提供输入
  2. 从程序收到的消息
  3. 给另一个输入
  4. 失去了连接

我不明白为什么会这样。我使用该socat命令有什么问题吗?如果是,请告诉我缺少/错误的内容。

这是程序。

#include <stdio.h>

void vuln(void) {
    printf("Input\n");
    char buffer[256];
    gets(buffer); // potential buffer overflow
}

int main(void) {
    vuln();
    return 0;
}
c socat
  • 1 1 个回答
  • 352 Views

1 个回答

  • Voted
  1. Best Answer
    Andy Dalton
    2021-12-27T18:15:31+08:002021-12-27T18:15:31+08:00

    在 C 中,printf是缓冲 I/O 库的一部分——写入流的数据在内存中“缓冲”(即,不直接写入内核)。

    默认情况下,stdout(printf写入数据的流)是行缓冲流,这意味着字节存储在内存缓冲区中,直到将换行符写入流(或者其他一些甚至触发刷新的事件)。

    如果标准输出不与终端相关联,stdout则为块缓冲流,这意味着字节存储在内存缓冲区中,直到缓冲区变满。

    当您在终端运行程序时,'\n'调用中的printf触发刷新(因为它是行缓冲的):

    $ ./a.out
    Input
    whatever-you-type
    $
    

    如果将输出重定向到文件,您将看到不同的行为:

    Terminal 1               Terminal 2
    --------------------     --------------------
    $ ./a.out > /tmp/out
                             $ cat /tmp/out
                             $
    type-input
    $
                             $ cat /tmp/out
                             Input
                             $ 
    

    当你没有运行socat时pts,输出流处于块缓冲模式;当您使用pts输出流运行它时,它处于行缓冲模式。

    如果您想覆盖该行为,您有几个选择。您可以调用函数来显式刷新任何缓冲数据:

    printf("Input\n");
    fflush(stdout);
    

    或者,您可以在调用之前显式设置输出流的缓冲模式printf:

    setvbuf(stdout, NULL, _IONBF, 0); // _IONBF = Unbuffered
    printf("Input\n");
    

    有关更详细的解释,请参阅 Robert Love 的书Linux System Programming的第 3 章。

    • 2

相关问题

  • 从 objdump 获取仅十六进制的输出

  • 使用 read() 读取 /proc/pid/maps

  • 堆什么时候用于动态内存分配?

  • GNU make dep 究竟做了什么?

  • 基于 OpenCV 的程序优化嵌入式 linux OS [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve