2013-03-29 8 views
5

Pracowałem w Javie i znam podstawowy C.Przekierowanie wyjścia fprintf do portu

Muszę debugować kod, który nie został napisany przeze mnie. W moich projektach Java, używam log4j o następującej konfiguracji:

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 

Potem korzystania z wtyczki beanmill w NetBeans do zapoznania się z dziennika, tak aby znać pochodzenie dzienniku. Możliwe jest przeszukiwanie kodu źródłowego ciągu znaków w wynikach dziennika, ale to wymaga czasu i muszę to zrobić dla wielu instrukcji. Beanmill sprawia, że ​​tak proste, jak kliknięcie na zalogowanej linii.

Teraz muszę pracować z pewnym kodem C, który używa wielu instrukcji fprintf.

Każdy pomysł, w jaki sposób mogę osiągnąć to, co robiłem z log4j i beanmill, przekierowując wyjście fprintf do portu 4445?

Pracuję w systemie Windows XP, z MinGW i NetBeans 7.3.

+1

Z jakiego systemu operacyjnego współpracujesz? Czy rozwiązanie musi być przenośne? –

+0

Praca w oknach ... nie musi być przenośna .. Wypisane oryginalne pytanie – Shiva

+0

Jeśli rozumiem cię poprawnie, twój kod C jest substytutem log4j? –

Odpowiedz

2

we fragmencie już wspomniano, są w zasadzie pisząc do gniazda która localhost:4445.

Nie trzeba przekierowywać fprintf do portu. Musisz uzyskać gniazdo komunikacji przy użyciu fprintf.

Ale gniazdo nie jest uchwytem plik a więc nie można użyć fprintf w tym przypadku. Możesz użyć fprintfsock, który jest specjalnie zaprojektowany do pracy z gniazdami. W systemie Windows możesz zrobić coś takiego:

#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

Należy zauważyć, że wykonanie tak ważnego deskryptora gniazda innego niż 'stdin' /' stderr' musi zostać przekazane do 'fprintf()' jako pierwszego parametru. Co oznacza modyfikację źródeł w przypadku, gdy 'stdin' /' stderr' są używane jawnie. – alk

+0

pracował dla mnie..dzięki !!! – Shiva

+0

nie ma za co :-) –