读取RSysLog tcp消息

时间:2016-01-10 23:00:21

标签: c++ linux tcp rsyslog

我试图从运行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;

1 个答案:

答案 0 :(得分:0)

您可能需要SOCK_DGRAM而不是SOCK_STREAM

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

您还可以尝试使用浏览器连接到服务器,以检查所有其余内容是否正常(但似乎没问题) - 192.168.1.8:514(仍处于TCP模式下)。