2013-06-12 3 views
2

Есть ли способ отправить сообщение на удаленный syslog в C++-коде?отправить сообщение удаленному rsyslog в C++

эквивалент этой строки в команде Linux:

nc -w0 -u 192.168.1.1 514 <<< "logging from remote" 

Этот код должен делать некоторые вещи с розеткой, но он не работает.

int main(int argc, char *argv[]) 
{ 
int listenfd = 0, connfd = 0,n; 
struct sockaddr_in serv_addr; 
    struct hostent *server; 


char sendBuff[1025]; 
sprintf(sendBuff,"bla bla"); 

time_t ticks; 

listenfd = socket(AF_INET, SOCK_DGRAM , 0); 
memset(&serv_addr, '0', sizeof(serv_addr)); 
memset(sendBuff, '0', sizeof(sendBuff)); 

serv_addr.sin_family = AF_INET; 
server = gethostbyname("192.168.1.108"); 
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); 

//serv_addr.sin_addr.s_addr = INADDR_ANY; 
serv_addr.sin_port = htons(514); 

    if ((n=connect(connfd,(const sockaddr*)&serv_addr,sizeof(serv_addr))) < 0){ 
      printf(" Connection to has failed Server "); 
    } 


bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

listen(listenfd, 10); 

while(1) 
{ 
    connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 

    write(connfd, sendBuff, strlen(sendBuff)); 

    close(connfd); 
    sleep(60); 
} 

}

+0

В качестве временной меры вы можете использовать 'system (nc -w0 -u 192.168.1.1 514 <<<" logging from remote ") для выполнения этой команды непосредственно из вашей программы. Если вы хотите получить результат, вы можете использовать этот ответ: http://stackoverflow.com/questions/478898/how-to-execute-a-command-and-get-output-of-command-within-c – IanPudney

+0

Да, я знаю это, но я не хочу использовать netcat в своем исходном коде. – RoiHatam

+0

Вот почему я упомянул, что это было временно. – IanPudney

ответ

1

nc -u просто отправляет данные через сокеты UDP. В этом нет ничего особенного, нет конкретного протокола: это просто необработанные данные. Вы можете просто отправлять свои сообщения через сокеты UDP в C++ (см. socket с параметрами AF_INET, SOCK_DGRAM и другими связанными функциями).

Но это означает, что вы пропускаете множество функций syslog, таких как возможности и приоритеты.

@Moose is right: API syslog больше подходит для ваших нужд, поскольку он намного более гибкий (нет необходимости изменять вашу программу, если вы хотите изменить поведение, вам нужно будет только перенастроить демона syslog).

+0

но не работает. rsyslog не получает сообщения. – RoiHatam

+1

Что не работает? Отправка данных через UDP или использование собственного 'syslog' API? – syam

3

На нескольких Unixes, включая Linux, вы можете просто использовать команду клиента http://linux.die.net/man/3/syslog и установить текущий сервер системного журнала, такие как системный журнал-нг. Этот сервер сможет не только фильтровать сообщения в соответствии с вашими правилами, но и отправлять их на любой удаленный syslog.

Если вы работаете в Windows, я боюсь, что вам нужно реализовать свой собственный протокол syslog. К счастью, это не так сложно и более или менее определено.