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

时间:2012-01-08 07:41:25

标签: c sockets printf

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

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

如何做到这一点?

3 个答案:

答案 0 :(得分:4)

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

将套接字映射到stderr

如果您尚未使用stderr,则可以使用dup2()将套接字置于输出通道中。即使您已将一些数据发送到原始stderr,您也可以这样做。关于使用fflush()的评论中的建议可能是相关的,但stderr通常是无缓冲的而不是完全缓冲的(因此通常不需要刷新任何内容)。

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

将套接字映射到其他流

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

答案 1 :(得分:3)

没有“C socket”这样的东西,但你可能指的是两件事之一(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

答案 2 :(得分:2)

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

您可以执行以下操作(更新为使用日志fifo):

mkfifo /path/to/log

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

http://netcat.sourceforge.net/