Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取RSysLog tcp消息_C++_Linux_Tcp_Rsyslog - Fatal编程技术网

C++ 读取RSysLog tcp消息

C++ 读取RSysLog tcp消息,c++,linux,tcp,rsyslog,C++,Linux,Tcp,Rsyslog,我试图从运行debian linux的机器上读取RSysLog日志。我在另一台linux机器上安装了一台服务器,可以读取日志消息。我想能够在C++的Windows机器上阅读它们。我已将远程计算机设置为将日志分发到windows计算机。我有一个在机器上运行的应用程序,它每隔一段时间写入日志消息。分发日志的设置格式为local1.*@@192.168.1.8,这是windows计算机的ip地址 我知道我没有正确地考虑这一点,远程计算机没有尝试连接到windows计算机,并且程序挂起接受调用 编辑:

我试图从运行debian linux的机器上读取RSysLog日志。我在另一台linux机器上安装了一台服务器,可以读取日志消息。我想能够在C++的Windows机器上阅读它们。我已将远程计算机设置为将日志分发到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;
WSADATA-WSADATA;
国际结果;
//初始化Winsock
iResult=WSAStartup(MAKEWORD(2,2)和wsaData);
如果(iResult!=0){
printf(“WSAStartup失败:%d\n”,iResult);
返回1;
}
插座h;
h=套接字(AF_INET,SOCK_STREAM,0);
if(h==无效的_套接字)
{

std::cout您可能需要
SOCK_DGRAM
而不是
SOCK_-STREAM

系统登录似乎发送UDP数据包,而不是TCP


您还可以尝试使用浏览器连接到服务器,以检查其余部分是否正常(尽管看起来正常)-192.168.1.8:514(仍处于TCP模式)。

您可能需要
SOCK\u DGRAM
而不是
SOCK\u STREAM

系统登录似乎发送UDP数据包,而不是TCP


您还可以尝试使用浏览器连接到服务器,以检查其余部分是否正常(尽管看起来正常)-192.168.1.8:514(仍处于TCP模式).

syslog可以发送UDP数据包或TCP数据包。在解决这个问题之前,我一直在研究UDP实现。在使用local1.*@192.168.1.8的远程计算机上,@@通知转发器发送TCP,如果我使用local1.*@192.168.1.8,它将发送UDP。我将查看SOCK_DGRAM。谢谢。@Sting-服务器似乎正常-w当在1024端口上从浏览器进行测试时,一切正常。因此必须是TCP vs UDP,或者是syslog的配置(没有任何输入),或者网络上的端口可能被阻止。谢谢你的帮助。我实现了一个快速脏的udp侦听器,它会在recvfrom上被阻止。我查看了windows防火墙,它允许对此应用程序进行任何思考。我将查看远程计算机上的防火墙。我怀疑这也很好,因为另一台linux计算机可以读取转发的数据使用stock rsyslog机制的消息。@Sting-看看与的流量可能会很有趣。Danny:谢谢你的帮助,我开始使用ncat工具,没有任何理由我能想到udp实现开始工作。我做了一些实验,认为TCP只有在服务器处于活动状态时,sysl才起作用og守护进程是在远程计算机上启动的,我只想进行定期检查,所以我想我会使用udp。再次感谢。syslog可以发送udp数据包或TCP数据包。在我能够解决这个问题之前,我将使用udp实现。在使用local1的远程计算机上。*@@192.168.1.8@@告诉转发器d tcp,如果我使用local1.*@192.168.1.8,它将发送UDP。我将查看SOCK_DGRAM。谢谢。@Sting-服务器似乎正常-当从浏览器在端口1024上进行测试时,一切正常。因此,它必须是tcp vs UDP,或者是系统日志的配置(没有任何内容),或者网络上的端口可能被阻止。谢谢你的帮助。我实现了一个快速脏的udp侦听器,它会在recvfrom上被阻止。我查看了windows防火墙,它允许对此应用程序进行任何思考。我将查看远程计算机上的防火墙。我怀疑这也很好,因为另一台linux计算机可以读取转发的数据使用stock rsyslog机制的消息。@Sting-看看与的流量可能会很有趣。Danny:谢谢你的帮助,我开始使用ncat工具,没有任何理由我能想到udp实现开始工作。我做了一些实验,认为TCP只有在服务器处于活动状态时,sysl才起作用og守护进程是在远程机器上启动的,我只想进行定期检查,所以我想我会使用udp。再次感谢。