【问题标题】:Reading RSysLog tcp messages读取 RSysLog tcp 消息
【发布时间】:2016-04-15 04:28:06
【问题描述】:

我正在尝试从运行 debian linux 的机器上读取 RSysLog 日志。我已经在另一台 linux 机器上设置了一个服务器,并且可以读取日志消息。我希望能够在 Windows 机器上从 c++ 读取它们。我已经设置远程机器将日志分发到 Windows 机器。我在机器上运行了一个应用程序,它会定期写入日志消息。分发日志的设置格式为 local1.* @@192.168.1.8,它是 windows 机器的 IP 地址。

我知道我没有正确考虑这一点,远程机器没有尝试连接到 Windows 机器,并且程序挂在接受调用上。

编辑: 经过一些进一步的测试,我发现连接发生在 syslog 守护进程启动时。要使用 tcp,服务器必须在守护程序启动时处于活动状态。这不是我想要的,所以我将更多地使用 UDP 实现。

这是我正在使用的代码,我已尝试使其尽可能简单。

WSADATA wsaData;
int iResult;

// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
    printf("WSAStartup failed: %d\n", iResult);
    return 1;
}

SOCKET h;

h = socket(AF_INET, SOCK_STREAM, 0);
if (h == INVALID_SOCKET)
{
    std::cout << "Socket Failure: " << std::endl;
    return 1;
}
std::cout << "Socket Success: " << std::endl;

// The server 
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("192.168.1.8");
server.sin_port = htons(514);

iResult = bind(h, (SOCKADDR *)&server, sizeof(server));
if (iResult == SOCKET_ERROR)
{
    std::cout << "Bind Failure: " << std::endl;
    closesocket(h);
    return 1;
}
std::cout << "Bind Success: " << std::endl;

if (listen(h, SOMAXCONN))
{
    std::cout << "Listen Failure: " << std::endl;
    errcode = WSAGetLastError();
    closesocket(h);
    return 1;
}
std::cout << "Listen Success: " << std::endl;

struct sockaddr_in dest;
int addrlen = sizeof(dest);
SOCKET s = accept(h, (sockaddr *)&dest, &addrlen);
if (s == INVALID_SOCKET)
{
    std::cout << "Accept Failure: " << std::endl;
}
else
{
    std::cout << "Accept Success: " << std::endl;
}
WSACleanup();

return 0;

【问题讨论】:

    标签: c++ linux tcp rsyslog


    【解决方案1】:

    您可能需要SOCK_DGRAM 而不是SOCK_STREAM

    port 514 上的 Syslog 似乎发送的是 UDP 数据包,而不是 TCP。

    您也可以尝试使用浏览器连接到服务器,以检查其余部分是否正常(不过似乎还可以) - 192.168.1.8:514(仍处于 TCP 模式)。

    【讨论】:

    • syslog 可以发送 UDP 数据包或 TCP 数据包。在弄清楚这一点之前,我将致力于 UDP 实现。在使用 local1.* @@192.168.1.8 的远程机器上,@@ 告诉转发器发送 tcp,如果我使用 local1.* @192.168.1.8,它将发送 UDP。我将研究 SOCK_DGRAM。谢谢。
    • @Sting - 服务器似乎没问题 - 在端口 1024 上从浏览器进行测试时一切正常。所以肯定是 TCP vs UDP,或者是 syslog 的配置(什么都没有进来),或者可能是某个端口在网络上被阻塞了。
    • 感谢您的帮助。我实现了一个快速而肮脏的 udp 侦听器,它在 recvfrom 上阻塞。我查看了 windows 防火墙,它对这个应用程序有任何想法。我将查看远程机器上的防火墙。我怀疑这也很好,因为另一台 linux 机器可以使用 stock rsyslog 机制读取转发的消息。
    • @Sting - 看看Wireshark 的流量可能会很有趣。
    • Danny:感谢您的帮助,我开始使用 ncat 工具,但我无缘无故地想到 udp 实现开始工作了。我做了一些实验,认为只有在远程机器上启动 syslog 守护进程时服务器还活着,TCP 才会起作用,我真的只想进行定期检查,所以我想我会使用 udp。再次感谢。
    猜你喜欢
    • 2015-05-12
    • 2017-12-20
    • 1970-01-01
    • 2017-01-02
    • 2013-01-28
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    相关资源
    最近更新 更多