2016-05-11 4 views
0

У меня есть InPipe, предназначенная для чтения в двоичных данных и OutPipe, предназначенная для записи двоичных данных, которые проходят через мой брандмауэр.Именованная труба читает только и не пишет

/// The input named pipe, "ToFirewall" 
static FILE* InPipe = NULL; 


/// The output named pipe, "FromFirewall" 
static FILE* OutPipe = NULL; 

Открываю обе трубы в отдельной функции.

static bool OpenPipes(void) 
{ 
    //ToFirewall 
    InPipe = fopen("ToFirewall", "rb"); 
    if(InPipe == NULL) 
    { 
     perror("ERROR, failed to open pipe ToFirewall:"); 
     return false; 
    } 

    OutPipe = fopen("FromFirewall", "wb"); 
    if(OutPipe == NULL) 
    { 
     perror("ERROR, failed to open pipe FromFirewall:"); 

      return false; 
     } 

    return true; 
} 

По какой-то причине, как я прочитал в данных, он будет пропускать через запись и не потрудился проверить, если он прошел через брандмауэр или нет. Я смотрел онлайн, и я читал решения о промывке, но это не помогло.

static void* FilterThread(void* args) { 
    OpenPipes(); 

    unsigned char* buffer = malloc(1500); 

    int ret = fread(buffer, 1, 1500, InPipe); 
    if(ret){ 
     fclose(InPipe); 
    } 


    //Check is FilterPacket will allow the packet through the firewall 
    if(FilterPacket(buffer, args)) { 
     fwrite(buffer, 1, 60, OutPipe); 
     fflush(OutPipe); 
    } 

//  fflush(OutPipe); 
    fclose(OutPipe); 

    return NULL; 
} 

Вот мой выход

RCVR: opened file output.bin 
SNDR: Waiting 200ms between packets 
SNDR: Number of packets: 18 
SNDR: Starting packet 0 
SNDR: Starting packet 1 
SNDR: Starting packet 2 
SNDR: Starting packet 3 
SNDR: Starting packet 4 
SNDR: Starting packet 5 
SNDR: Starting packet 6 
SNDR: Starting packet 7 
SNDR: Starting packet 8 
SNDR: Starting packet 9 
SNDR: Starting packet 10 
SNDR: Starting packet 11 
SNDR: Starting packet 12 
SNDR: Starting packet 13 
SNDR: Starting packet 14 
SNDR: Starting packet 15 
SNDR: Starting packet 16 
SNDR: Starting packet 17 
SNDR: Finished, wrote 18 packets to the pipe 

И здесь вы можете увидеть, что ожидаемый результат должен выглядеть на самом деле

> RCVR: opened file output.bin 
SNDR: Waiting 200ms between packets 
SNDR: Number of packets: 18 
SNDR: Starting packet 0 
SNDR: Starting packet 1 
RCVR: 129.21.37.11 -> 74.125.21.103 
SNDR: Starting packet 2 
RCVR: 74.125.21.103 -> 129.21.37.11 
SNDR: Starting packet 3 
SNDR: Starting packet 4 
RCVR: 129.21.37.11 -> 74.125.21.103 
SNDR: Starting packet 5 
SNDR: Starting packet 6 
RCVR: 74.125.21.103 -> 129.21.37.11 
SNDR: Starting packet 7 
RCVR: 129.21.37.28 -> 74.125.21.103 
SNDR: Starting packet 8 
SNDR: Starting packet 9 
RCVR: 129.21.37.11 -> 74.125.21.103 
SNDR: Starting packet 10 
RCVR: 74.125.21.103 -> 129.21.37.28 
SNDR: Starting packet 11 
SNDR: Starting packet 12 
RCVR: 74.125.21.103 -> 129.21.37.11 
SNDR: Starting packet 13 
RCVR: 129.21.37.28 -> 74.125.21.103 
SNDR: Starting packet 14 
SNDR: Starting packet 15 
SNDR: Starting packet 16 
RCVR: 129.21.37.11 -> 74.125.21.103 
SNDR: Starting packet 17 
RCVR: 74.125.21.103 -> 129.21.37.28 
SNDR: Finished, wrote 18 packets to the pipe 
FwSim, Commanding firewall to Exit 
RCVR: 74.125.21.103 -> 129.21.37.11 
Exiting 
+1

Можете ли вы попробовать создать [Minimal, Complete, и Проверяемость Пример] (HTT p: //stackoverflow.com/help/mcve) и показать нам? Где в программе вы печатаете вывод? Вы проверили, что «fread» (а также 'fwrite') действительно возвращается? –

+0

О, и вы знаете, что трубы являются * потоковыми *, то есть это может не дать вам все данные, которые вы запрашиваете в одном запросе на чтение, вам, возможно, придется читать в цикле. –

+0

Что находится на другом конце труб? – immibis

ответ

0

Считанные читает до 1500 байт данных, но записывали только 60 байтов. Вы можете это исправить:

fwrite(buffer, 1, ret, OutPipe); 

И запись будет происходить только с фильтром проверил возвращается верно, так, чтобы помочь отладить, я предлагаю добавить журнал, когда фильтр возвращает ложь:

if(FilterPacket(buffer, args)) { 
    fwrite(buffer, 1, ret, OutPipe); 
    fflush(OutPipe); 
} else { 
    fprintf(stderr, "FilterPacket returned false for packet %s\n", buffer); 
} 

Кроме того, buffer не освобождается, когда функция возвращает, это приведет к утечке памяти, добавьте в конец функции:

free(buffer);