【发布时间】:2016-04-15 04:28:06
【问题描述】:
我正在尝试从运行 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;
【问题讨论】: