2013-03-29 147 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

不客氣:-) –