【问题标题】:How to redirect fprintf output to C socket?如何将 fprintf 输出重定向到 C 套接字?
【发布时间】:2012-01-08 17:25:02
【问题描述】:

如何将fprintf 输出重定向到套接字?

我正在编辑有很多fprintf 调用的源代码。它记录到一个文件中。但我想将此日志重定向到套接字。

如何做到这一点?

【问题讨论】:

    标签: c sockets printf


    【解决方案1】:

    在类 Unix 系统上,打开套接字(获取文件描述符)。

    将套接字映射到stderr

    如果您还没有使用stderr,您可以简单地使用dup2() 使套接字进入输出通道。即使您已将一些数据发送到原始stderr,您也可以这样做。评论中关于使用fflush() 的建议可能是相关的,尽管stderr 通常是无缓冲的而不是完全缓冲的(因此通常没有任何东西要刷新)。

    freopen() 函数可用于更改流的输出,例如stderr(特别是)。嗯,你能用freopen()stderr 映射到/dev/fd/N 其中N 是套接字的文件描述符吗?是的,你可能可以。

    将套接字映射到其他流

    重新阅读您的问题 - 我没有在其中看到 stderr。所以fdopen() 函数从文件描述符创建一个流。因此,如果您可以指定要写入的日志记录流,那么您就回家了。如果您不能指定它但可以看到它,那么上面的 freopen() 技巧也应该在这里工作。

    【讨论】:

    • 如果你想使用dup2,但已经写信给stderr,那就先写fflush(stderr)吧。
    【解决方案2】:

    没有“C 套接字”这样的东西,但您可能指的是两件事之一(WinSock 或 libsocket)。无论哪种方式,我使用的基本方法是使用 #define 和一个简单的函数,类似于:

    #define fprintf(a,b,...) fprintfsock(a,b,__VA_ARGS__)
    
    void fprintfsock( SOCKET s, const char* f, ... )
    {
        va_list a;
        va_start( a, f );
        int l = vsnprintf( 0, 0, f, a );
        char* buf = (char*) malloc( l + 1 );
        va_start( a, f );
        vsnprintf( buf, l, f, a );
        send( s, buf, l, 0 );
        free( buf );
    }
    

    这两者都可以,除了 libsocket 你应该 typedef 或使用 int 作为 SOCKET。 完成登录到套接字后,请确保您 #undef fprintf

    【讨论】:

    • POSIX.1-2001 另有说明。从技术上讲,“C 套接字”(意思是 POSIX 套接字)只是文件描述符。其他答案更好地解决了这个问题。
    • @arjunyg 不过,除了 POSIX,这个世界还有更多的东西。套接字可能是 *nix 上的文件描述符,但问题中未提供特定平台。但是,鉴于已接受的答案,他们似乎确实在询问 *nix 系统上的套接字。同样回想起来,这个答案有点恶心;)
    【解决方案3】:

    我知道这不是你的问题,但你可能会考虑使用像 netcat 这样的工具,而不是弄乱代码(这似乎不是一个微不足道的改变)。

    你可以这样做(更新为使用日志先进先出):

    mkfifo /path/to/log
    
    nc <ip> <port> < /path/to/log
    

    http://netcat.sourceforge.net/

    【讨论】:

    • 更新为使用先进先出,更直接地应用于您正在做的事情。
    • socat 有更多的可能性,包括 UNIX 套接字等等。
    • 我的回答真的应该被扣分吗?我只是提供一个替代方案。
    • 这是个好技巧。但是我的软件 Snort 不写入 stdout !另外,我想通过套接字而不是记录到文件来提高日志性能。
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2021-02-04
    • 2019-07-19
    相关资源
    最近更新 更多