2013-12-12 40 views
0

我最近一直在編寫一個netflow接收器,通過UDP監聽netflow。一旦它處理了流數據報,它將它寫入syslog。我的問題是,一旦我收到標準recvfrom函數的數據報包,我的消息就不會再傳給syslog了。我正在接收和處理數據,但系統日誌寫入不起作用。代碼如下所示C recvfrom打破系統日誌

setlogmask(LOG_UPTO(LOG_NOTICE)); 
openlog("netflow_receiver", LOG_CONS, LOG_LOCAL2); 
syslog(LOG_NOTICE, "Syslogger started"); 

while(1){ 

    syslog(LOG_NOTICE, "Top of loop"); 
    unsigned char* mesg = (unsigned char*)malloc(1024 * sizeof(unsigned char)); 
    syslog(LOG_NOTICE, "Allocated message memory"); 

    len = sizeof(cliaddr); 
    syslog(LOG_NOTICE, "Got len of client"); 

    //Syslog stops after this 
    n = recvfrom(sockfd, mesg, 1024, 0, (struct sockaddr *) &cliaddr, &len); 
    syslog(LOG_NOTICE, "received"); 
    mesg[n] = 0; 

    syslog(LOG_NOTICE, "Calling log_record"); 
    process_record(mesg); 
    syslog(LOG_NOTICE, "Back from log_record"); 

} 

系統日誌看起來就像這樣

Dec 12 09:42:01 my_pc netflow_receiver: Syslogger started 
Dec 12 09:42:01 my_pc netflow_receiver: Top of loop 
Dec 12 09:42:01 my_pc netflow_receiver: Allocated message memory 
Dec 12 09:42:01 my_pc netflow_receiver: Got len of client 
Dec 12 09:48:33 my_pc netflow_receiver: Syslogger started 
Dec 12 09:48:33 my_pc netflow_receiver: Top of loop 
Dec 12 09:48:33 my_pc netflow_receiver: Allocated message memory 
... 

任何想法或建議...我願意,如果有人知道一個使用非標準C庫的syslog好的。

+0

[請不要在C]中輸入'malloc()'的返回值(http://stackoverflow.com/a/605858/28169)。也不要用'sizeof(char)'來縮放,它總是1,所以它不會增加代碼的質量,但會增加很多噪音。你的分配應該是:'unsigned char * msg = malloc(1024);'。布拉姆。 – unwind

+0

感謝您對malloc的鑄造建議。以前從未遇到過任何問題,但這很好理解。不過,我總是會使用'needed_size * sizeof(type)',因爲這是我的編碼風格,我喜歡確保從malloc中獲得正確的數量,而不管它是多麼隱含。 – Tommy

回答

0
mesg[n] = 0; is wrong 

如果recvfrom的返回1024

的syslog下降從消息 的高負荷處理消息,你會在你想要的東西之外索引到記憶中。

同樣的事情,如果recvfrom返回-1。

請確保您處理這兩種情況。

您需要確保sockfd實際上具有您的套接字的正確值,syslog也會打開一個套接字,如果您在某處發生了某些錯誤並且從該文件描述符開始讀取,則會發生奇怪的事情。

+0

你是絕對正確的'mesg [n] = 0'位。完全沒有看那個,那個微妙的bug已經修復了,但我不相信這是造成系統日誌麻煩的原因。奇怪的是,它現在正在工作。不知道我做了什麼不同,但一切都使它syslog(甚至在我修復此錯誤之前)。 – Tommy

+0

這就是當你在內存中覆蓋相當隨機的東西時發生的事情,奇怪的事情發生。除非你很幸運,它會崩潰。 – nos

+0

我會斷定這是主要的嫌疑人。謝謝您的幫助 – Tommy

0

這很可能不是recvfrom的錯。你可以通過註釋掉recvfrom()行來檢查它並重新運行你的應用程序。如果你需要所有這些日誌考慮記錄到文件,並使用日誌庫(如log4cxx,...)

+0

我試過了,它繼續打印系統日誌消息的其餘部分。我相信我不會重載系統日誌消息加載。我有另一個應用程序,它與這個c代碼一樣,但它是用java編寫的,它每秒鐘記錄數千條消息,沒有任何問題。另外我正在測試一個只有一個包的樣本文件。我會簡單地'貓樣品| nc -u 127.0.0.1 6789'進行測試。感謝您的輸入,雖然:) – Tommy