【发布时间】:2012-01-08 17:25:02
【问题描述】:
如何将fprintf 输出重定向到套接字?
我正在编辑有很多fprintf 调用的源代码。它记录到一个文件中。但我想将此日志重定向到套接字。
如何做到这一点?
【问题讨论】:
如何将fprintf 输出重定向到套接字?
我正在编辑有很多fprintf 调用的源代码。它记录到一个文件中。但我想将此日志重定向到套接字。
如何做到这一点?
【问题讨论】:
在类 Unix 系统上,打开套接字(获取文件描述符)。
stderr
如果您还没有使用stderr,您可以简单地使用dup2() 使套接字进入输出通道。即使您已将一些数据发送到原始stderr,您也可以这样做。评论中关于使用fflush() 的建议可能是相关的,尽管stderr 通常是无缓冲的而不是完全缓冲的(因此通常没有任何东西要刷新)。
freopen() 函数可用于更改流的输出,例如stderr(特别是)。嗯,你能用freopen() 将stderr 映射到/dev/fd/N 其中N 是套接字的文件描述符吗?是的,你可能可以。
重新阅读您的问题 - 我没有在其中看到 stderr。所以fdopen() 函数从文件描述符创建一个流。因此,如果您可以指定要写入的日志记录流,那么您就回家了。如果您不能指定它但可以看到它,那么上面的 freopen() 技巧也应该在这里工作。
【讨论】:
dup2,但已经写信给stderr,那就先写fflush(stderr)吧。
没有“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!
【讨论】:
我知道这不是你的问题,但你可能会考虑使用像 netcat 这样的工具,而不是弄乱代码(这似乎不是一个微不足道的改变)。
你可以这样做(更新为使用日志先进先出):
mkfifo /path/to/log
nc <ip> <port> < /path/to/log
【讨论】: