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

如何将fprintf输出重定向到C套接字?,c,sockets,printf,C,Sockets,Printf,如何将fprintf输出重定向到套接字 我正在编辑有很多fprintf调用的源代码。它记录到一个文件中。但我想将此日志重定向到套接字 如何做到这一点?在类Unix系统上,打开套接字(获取文件描述符) 将套接字映射到stderr 如果尚未使用stderr,只需使用dup2()将套接字插入输出通道即可。即使已将一些数据发送到原始的stderr,您也可以这样做。注释中关于使用fflush()的建议可能是相关的,尽管stderr通常是无缓冲的,而不是完全缓冲的(因此通常没有任何东西需要刷新) freop

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

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


如何做到这一点?

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

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

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

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

< P>我意识到这不是你的问题,但是你可以考虑使用一个工具,比如NETCAT,而不是乱搞代码(这看起来并不是一个微小的改变)。 您可以这样做(更新为使用日志fifo):

mkfifo/path/to/log
nc

没有“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之外,您应该为SOCKET键入def或使用int。
确保在完成对套接字的日志记录后,
#取消fprintf

如果您想使用
dup2
,但已经写入了stderr,只需先执行
fflush(stderr)
即可。更新为使用fifo,这将更直接地应用于您正在做的事情。socat有更多的可能性,包括UNIX套接字等。我的答案真的值得一个负号吗?我只是提供了一个替代方案。这是一个好把戏。但是我的软件,Snort,不写标准输出!另外,我希望通过套接字提高日志性能,而不是登录到文件。POSIX.1-2001则相反。从技术上讲,“C套接字”(意味着POSIX套接字)只是文件描述符。其他答案更能说明这一点。@arjunyg世界不仅仅是POSIX。套接字可能是*nix上的文件描述符,但问题中未提供特定平台。然而,根据公认的答案,他们似乎确实在询问*nix系统上的套接字。回想起来,这个答案有点恶心;)
#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 );
}