Форум программистов, компьютерный форум CyberForum.ru

Проверить, подключен ли клиент к серверу - C++

Восстановить пароль Регистрация
 
bonanza
1 / 1 / 0
Регистрация: 23.03.2015
Сообщений: 19
22.01.2016, 07:53     Проверить, подключен ли клиент к серверу #1
Извиняюсь за возможно глупый вопрос, но ничего внятного я не нашел.
Пишу программу, которая будет собирать данные детализации звонков с АТС по протоколу TCP (CDR или SMDR, если кто в курсе) и уткнулся в одну проблему. Я не могу детектировать прерывание связи с АТС. Если сеть отваливается, то данная функция зависает во втором цикле, так как сокет нужно открыть по-новой.
Подскажите, как решаются проблемы такого рода?
Как детектировать прерывание связи с удаленной стороной из-pf временного обрыва сети или перезагрузкой программы на дальней стороне?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
void tcp_collect(settings* config)
{
    
    char buf[MAX_MESSAGE];            // maximum single datagram
    char buffer[MESSAGE_BUFFER];      // buffer to collect datagrams
    char message[MAX_MESSAGE] = "\0";
    struct sockaddr_in serv_addr, cli_addr;
    int n;
 
    while (TRUE) 
        {
 
        int sockfd, newsockfd;
        socklen_t clilen;
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0)
        {
           error("Ошибка открытия сокета");
        } 
        bzero((char *) &serv_addr, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = htons(config->port);
        if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
        {
            error("Ошибка привязки сокета");  
        }       
        listen(sockfd,5);
        clilen = sizeof(cli_addr);
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        if (newsockfd < 0)
        { 
            error("ERROR on accept");
        }
 
        int nread;
        
        while (TRUE)
        {
            bzero(buf, MAX_MESSAGE);
            nread = read(newsockfd, buf, sizeof(buf) - 1);
            if (nread == 0)  continue;
            if (nread < 0)
            {            
                error("ERROR reading from socket");
                break;
            }
            if (config->flag_dump) 
            {
                fappend(config->dump, buffer);
            }
            buf[nread] = '\0';                           // finishing message
            //TODO защитить от переполнения
    //        strcat(buffer, buf);                         // add recieved piece of data to buffer
   
            // get all messages from buffer
    /*        while(get_message(config, buffer, message))
            {
                cout << message << endl << endl; //TODO вместо этого отправляем message в БД
            }*/
            //if (recv())
        }
        close(newsockfd);
        close(sockfd);
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2016, 07:53     Проверить, подключен ли клиент к серверу
Посмотрите здесь:

Как отправлять пакеты серверу C++
Не подключен файл, а работает, как так? C++
C++ Нужно средствами api определить сеть к которой подключен пк
Послать сигнал серверу о результатах поиска C++
C++ Заголовочный файл подключен, но не виден тип
C++ По подключением сокетов | Подключение к серверу vk.com
Ошибка опрваки сообщения серверу C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 01:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru