2016-01-10 5 views
1

Я пытаюсь прочитать журнал 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; 

ответ

0

Вы, вероятно, нужно SOCK_DGRAM вместо SOCK_STREAM.

Syslog на port 514, кажется, отправляет UDP-пакеты, а не TCP.

Вы также можете попытаться подключиться к серверу с помощью браузера, чтобы проверить, все ли в порядке (кажется, все равно) - 192.168.1.8:514 (пока все еще в режиме TCP).

+0

syslog может отправлять либо UDP-пакеты, либо TCP-пакеты. Я собирался работать над реализацией UDP, пока не смогу это понять. На удаленном компьютере с использованием local1. * @@ 192.168.1.8 @@ сообщает экспедитору отправить tcp, и если я использую local1. * @ 192.168.1.8, он отправит UDP. Я рассмотрю SOCK_DGRAM. Спасибо. – Sting

+0

@Sting - сервер выглядит нормально - при тестировании из браузера на порту 1024 все хорошо. Таким образом, это должен быть TCP vs UDP, или конфигурация syslog (ничего не приходит), или, возможно, заблокированный порт в сети. –

+0

благодарит за вашу помощь. Я реализовал быстрый и грязный прослушиватель udp, и он блокируется на recvfrom. Я посмотрел на брандмауэр Windows, и он все равно думает об этом приложении. Я посмотрю брандмауэр на удаленной машине. Я подозреваю, что это хорошо, так как другая машина linux может читать перенаправленные сообщения, используя механизм rsyslog. – Sting

Смежные вопросы