2016-01-10 71 views
1

我试图从运行debian linux的机器上读取RSysLog日志。我在另一台linux机器上安装了一台服务器,并且可以读取日志消息。我希望能够从C++的Windows机器上读取它们。我已经设置了远程机器来将日志分发给Windows机器。我有一台应用程序在间隔写入日志消息的机器上运行。分发日志的设置格式为local1。* @@ 192.168.1.8,它是Windows机器的IP地址。阅读RSysLog TCP消息

我知道我没有正确地考虑这个问题,远程计算机不会尝试连接到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; 

回答

0

您可能需要SOCK_DGRAM而不是SOCK_STREAM

port 514上的系统日志似乎发送UDP数据包,而不是TCP。

你也可以尝试用浏览器连接到服务器,检查其余的是否正常(虽然看起来不错) - 192.168.1.8:514(仍处于TCP模式)。

+0

syslog可以发送UDP数据包或TCP数据包。我打算开发一个UDP实现,直到我能弄明白为止。在使用local1。* @@ 192.168.1.8的远程机器上,@@告诉转发器发送tcp,如果我使用local1。* @ 192.168.1.8它将发送UDP。我将研究SOCK_DGRAM。谢谢。 – Sting

+0

@Sting - 服务器似乎没问题 - 从1024端口的浏览器进行测试时一切正常。所以它必须是TCP vs UDP,或者syslog的配置(没有进来),或者网络上的一个端口被阻塞。 –

+0

感谢您的帮助。我实现了一个快速而脏的udp监听器,它阻塞了recvfrom。我查看了Windows防火墙,并且发现了这个应用程序的任何想法。我会看远程机器上的防火墙。我怀疑这也很好,因为另一台linux机器可以使用stock rsyslog机制读取转发的消息。 – Sting