2013-03-29 2 views
5

Java로 작업했으며 기본 C를 알고 있습니다.fprintf 출력을 포트로 리디렉션

필자가 작성하지 않은 코드를 디버깅해야합니다. 내 자바 프로젝트에서, 나는 다음과 같은 구성으로 log4j를 사용하고있다 : 나는 로그의 출처를 알 수 있도록 로그를 읽을 넷빈즈에서 beanmill 플러그인을 사용 그 후

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 

합니다. 로그 출력에서 ​​문자열의 소스 코드를 검색하는 것은 가능하지만 그 작업에는 시간이 걸리고 많은 문장을 처리해야합니다. Beanmill은 기록 된 라인을 클릭하는 것만 큼 쉽습니다.

이제 많은 fprintf 문을 사용하는 일부 C 코드를 사용해야합니다.

fprintf 출력을 포트 4445로 리디렉션하여 log4j 및 beansmill으로 내가 뭘 할 수 있었는지 알기 원하십니까?

저는 MinGW 및 NetBeans 7.3이 설치된 Windows XP에서 작업하고 있습니다.

+1

어떤 OS를 사용하고 있습니까? 솔루션은 이식성이 있어야합니까? –

+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

당신을 환영합니다 :-) –

관련 문제