C recvfrom中断系统日志

C recvfrom中断系统日志,c,syslog,C,Syslog,我最近用C编写了一个netflow接收器,它通过UDP监听netflow。处理流数据报后,它会将其写入syslog。我的问题是,一旦我收到带有标准recvfrom函数的数据报包,我的消息就不再发送到syslog。我很好地接收和处理了数据,但是系统日志编写不起作用。代码如下所示 setlogmask(LOG_UPTO(LOG_NOTICE)); openlog("netflow_receiver", LOG_CONS, LOG_LOCAL2); syslog(LOG_NOTICE, "Syslog

我最近用C编写了一个netflow接收器,它通过UDP监听netflow。处理流数据报后,它会将其写入syslog。我的问题是,一旦我收到带有标准recvfrom函数的数据报包,我的消息就不再发送到syslog。我很好地接收和处理了数据,但是系统日志编写不起作用。代码如下所示

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
...
系统日志看起来就像这样

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系统日志库,我愿意使用非标准的C系统日志库。

这很可能不是recvfrom的错。您可以通过注释recvfrom()行并重新运行应用程序来检查这一点

syslog从消息负载高的进程中删除消息 如果您需要所有这些日志,请考虑将日志记录到文件并使用日志库(例如Log4Cxx,…)< /P> 如果recvfrom返回1024,则您的索引将超出您应该执行的范围

如果recvfrom返回-1,情况也是一样

一定要处理好这两种情况


您需要确保sockfd实际具有正确的套接字值,syslog也会打开一个套接字,如果您在某个地方出现错误并开始读取该文件描述符,则会发生奇怪的事情。

。也不要按
sizeof(char)
进行缩放,它始终为1,因此它不会增加代码的质量,但会增加大量噪声。您的分配应该是:
unsignedchar*msg=malloc(1024)。谢谢你对马洛克的建议。以前从未遇到过任何问题,但很高兴知道这一点。然而,我可能会始终使用
needed\u size*sizeof(type)
,因为这是我的编码风格,我喜欢确保我从malloc获得了正确的数量,不管它有多含蓄。你对
mesg[n]=0
位的看法绝对正确。我完全没有注意到这一点,那个微妙的错误已经被修复,但我不相信这就是导致系统日志问题的原因。奇怪的是,它现在正在工作。我不知道我做了什么有什么不同,但一切都在进入syslog(甚至在我修复这个bug之前)。当你覆盖内存中相当随机的东西时,就会发生这种情况,奇怪的事情就会发生。除非你运气好,它崩溃了。我会断定这是主要嫌疑犯。谢谢你的帮助,我试过了,它继续打印其余的系统日志消息。我确信我没有使syslog消息负载过载。我有另一个应用程序,它和这个c代码做的一样,但是它是用java编写的,它每秒记录数千条消息,没有任何问题。另外,我用一个只有一个数据包的示例文件进行测试。我只需
cat-sample | nc-u 127.0.0.1 6789
进行测试。感谢您的意见:)