将fprintf输出重定向到端口

时间:2013-03-29 10:07:17

标签: c logging netbeans log4j netbeans-7

我使用过Java,我知道基本的C。

我必须调试不是我编写的代码。在我的Java项目中,我一直在使用具有以下配置的log4j:

log4j.rootCategory=INFO, A1, socket
log4j.appender.socket=org.apache.log4j.net.SocketAppender
log4j.appender.socket.remoteHost=localhost
log4j.appender.socket.port=4445
log4j.appender.socket.locationInfo=true
log4j.appender.A1=org.apache.log4j.ConsoleAppender

之后,我使用NetBeans中的beanmill插件来读取日志,以便了解日志的来源。可以在日志输出中搜索源代码中的字符串,但这需要时间,我必须为很多语句执行此操作。 Beanmill可以轻松点击记录的行。

现在我必须使用一些使用大量fprintf语句的C代码。

知道如何通过将fprintf输出重定向到端口4445来实现我对log4j和beanmill所做的工作吗?

我在Windows XP中使用MinGW和NetBeans 7.3。

1 个答案:

答案 0 :(得分:2)

在您提到的代码段中,您基本上是在写一个套接字,即localhost:4445

您无需将fprintf重定向到端口。您需要使用fprintf实现套接字通信

套接字不是文件句柄,因此在这种情况下您不能使用fprintf。您可以使用专为处理套接字而设计的fprintfsock。在Windows上,您可以执行以下操作:

#define fprintf(a,b,...) fprintfsock(a,b,__VA_ARGS__)

void fprintfsock( SOCKET s, const char* f, ... )
{
    va_list a;
    va_start( a, f );
    //vsnprintf will return total number of characters excluiding null-terminator
    int l = vsnprintf( 0, 0, f, a ) + 1 ;
    char* buf = (char*) malloc(l);
    va_start( a, f );
    // vsnprintf will write at most l characters including null-terminator
    vsnprintf( buf, l, f, a );
    send( s, buf, l, 0 );
    free( buf );
}