5

私は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 で行っていたことをどのように達成できるでしょうか?

MinGW と NetBeans 7.3 を使用して、Windows XP で作業しています。

4

1 に答える 1

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 );
}
于 2013-03-30T08:13:34.467 に答える