我试图从运行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;
答案 0 :(得分:0)
您可能需要SOCK_DGRAM
而不是SOCK_STREAM
。
port 514上的Syslog似乎发送UDP数据包,而不是TCP。
您还可以尝试使用浏览器连接到服务器,以检查所有其余内容是否正常(但似乎没问题) - 192.168.1.8:514(仍处于TCP模式下)。