Я пытаюсь прочитать журнал RSysLog с машины, на которой работает debian linux. Я установил сервер на другой Linux-машине и могу читать сообщения журнала. Я хочу, чтобы читать их на Windows-машине из C++. Я установил удаленную машину для распространения журналов на машину Windows. У меня есть приложение, запущенное на машине, которая с периодичностью записывает сообщения журнала. Настройка распространения журналов имеет форму local1. * @@ 192.168.1.8, которая является IP-адресом машины Windows.Чтение сообщений RSsLog tcp
Я знаю, что я не думаю об этом правильно, удаленная машина не пытается подключиться к машине Windows, и программа зависает при вызове accept.
Редактировать: После некоторого дополнительного тестирования выяснилось, что соединение происходит при запуске демона 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 может читать перенаправленные сообщения, используя механизм rsyslog. – Sting