如何将fprintf
输出重定向到套接字?
我正在编辑有很多fprintf
次调用的源代码。它记录到一个文件。但我想将此日志重定向到套接字。
如何做到这一点?
答案 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