我用过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代码。
任何想法我怎么能实现我正在做的log4j和beanmill通过重定向fprintf
输出到端口4445?
我在Windows XP中工作,使用MinGW和NetBeans 7.3。
在您提到的代码片段中,您基本上是在写入套接字,即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 );
}