2013-03-29 92 views
5

我曾在Java中工作过,我知道基本的C.将fprintf输出重定向到端口

我必须调试不是由我写的代码。在我的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

在windows ..中工作不需要是便携式的。编辑原始问题 – Shiva

+0

如果我理解正确,您的C代码是log4j的替代品吗? –

回答

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); 
    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); 
} 
+0

需要注意的是,这样做必须将一个与'stdin' /'stderr'不同的有效套接字描述符作为第一个参数传递给'fprintf()'。这意味着在stdin/stderr被明确使用的情况下修改源代码。 – alk

+0

为我工作..谢谢! – Shiva

+0

不客气:-) –