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;
syslog可以发送UDP数据包或TCP数据包。我打算开发一个UDP实现,直到我能弄明白为止。在使用local1。* @@ 192.168.1.8的远程机器上,@@告诉转发器发送tcp,如果我使用local1。* @ 192.168.1.8它将发送UDP。我将研究SOCK_DGRAM。谢谢。 – Sting
@Sting - 服务器似乎没问题 - 从1024端口的浏览器进行测试时一切正常。所以它必须是TCP vs UDP,或者syslog的配置(没有进来),或者网络上的一个端口被阻塞。 –
感谢您的帮助。我实现了一个快速而脏的udp监听器,它阻塞了recvfrom。我查看了Windows防火墙,并且发现了这个应用程序的任何想法。我会看远程机器上的防火墙。我怀疑这也很好,因为另一台linux机器可以使用stock rsyslog机制读取转发的消息。 – Sting