gpt4 book ai didi

c++ - 读取 RSysLog tcp 消息

转载 作者:可可西里 更新时间:2023-11-01 02:54:06 26 4
gpt4 key购买 nike

我正在尝试从运行 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;

最佳答案

您可能需要 SOCK_DGRAM 而不是 SOCK_STREAM

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

您也可以尝试使用浏览器连接到服务器以检查是否一切正常(虽然看起来正常)- 192.168.1.8:514(同时仍处于 TCP 模式)。

关于c++ - 读取 RSysLog tcp 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34711780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com