Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
3 / 3 / 2
Регистрация: 13.02.2015
Сообщений: 42
1

Синхронные сокеты и таймаут

16.06.2015, 11:21. Просмотров 1208. Ответов 4
Метки нет (Все метки)

Решил соорудить небольшой наколенный многопоточный клиент dht . Есть некоторые вопросы по сокетам и гугол как-то больше молчит .

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
67
68
69
70
71
72
73
74
75
        SOCKET dht_sock = socket(AF_INET, SOCK_DGRAM, 0);
        if (dht_sock == INVALID_SOCKET)
        {
          cout << "socket error: " << WSAGetLastError() << endl;
          WSACleanup();
          return -1;
        }
 
        struct timeval tv;
        tv.tv_sec = 0;
        tv.tv_usec = 5;
 
        if (setsockopt (dht_sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv,sizeof(tv)) < 0)
        {
            cout <<  ipaddr.c_str() << "setsockopt SO_SNDTIMEO failed" << endl;
            return 0;
        }
 
        if (setsockopt(dht_sock, SOL_SOCKET, SO_RCVTIMEO,(char *)&tv,sizeof(tv)) < 0) 
        {
            cout <<  ipaddr.c_str() << "setsockopt SO_RCVTIMEO failed" << endl;
            return 0;
        }
 
        HOSTENT *hst;
        sockaddr_in dest_addr;
        memset(&dest_addr,0,sizeof(sockaddr_in));
 
        dest_addr.sin_family=AF_INET;
        dest_addr.sin_port=htons(ipport);
 
        dest_addr.sin_addr.s_addr = inet_addr(ipaddr.c_str());
 
        int n = 0;
        std::string ping_str("d1:ad2:id20:adcfe1aadj0823e567b921:q4:ping1:t2:aa1:y1:qe");
        n = sendto(dht_sock,(char*)ping_str.c_str(),ping_str.length(),0,
            (sockaddr *) &dest_addr,sizeof(sockaddr_in));
 
        if (n == SOCKET_ERROR)
        {
            cout << ipaddr << " sendto() error: " << WSAGetLastError() << endl;
            closesocket(dht_sock);
            WSACleanup();
            continue;
        }   
        else if(n < 0 || n == EWOULDBLOCK)
        {
            cout << ipaddr << " sendto() timeout error: " << WSAGetLastError() << endl;
            closesocket(dht_sock);
            continue;
        }
 
        sockaddr_in server_addr;
        memset(&server_addr,0,sizeof(sockaddr_in));
 
        int server_addr_size=sizeof(server_addr);
 
        char buff[UDPMAXSIZE];
        memset(&buff,0,UDPMAXSIZE);
 
        n = recvfrom(dht_sock,&buff[0],UDPMAXSIZE,0,
        (sockaddr *) &server_addr, &server_addr_size);
        if (n==SOCKET_ERROR)
        {
            cout << ipaddr << " dht recvfrom() error: " << WSAGetLastError() << endl;
            closesocket(dht_sock);
            continue;
        }
        else if(n < 0 || n == EWOULDBLOCK)
        {
            cout << ipaddr << " recvfrom() timeout error: " << WSAGetLastError() << endl;
            closesocket(dht_sock);
            continue;       
        } else {
...
Собственно это за небольшим вычетом код потока . Вопросы такие :
1 Работает ли на win таймауты SO_SNDTIMEO , SO_RCVTIMEO на синхронных сокетах для sendto , recvfrom ? Или я это сам себе придумал .
2 Будет ли возвращаемое значение socket ф-ции соотвественно n < 0 || n == EWOULDBLOCK при таймауте . Нашел это на stackoverflow .
3 struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 5;
Сейчас ведет себя странно . Если задать время через tv_sec - таймаут вообще игнорируется . Если же задавать через tv_usec любую цифирь он зависает .
В общем я где-то косячу . Надеюсь мне подскажут в чем .
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2015, 11:21
Ответы с готовыми решениями:

Клиент-сервер. Синхронные и асинхронные сокеты
Здравствуйте, в чем разница между синхронными и асинхронными сокетами? слышал что с асинхронным...

Синхронные запросы
Добрый вечер! Кто знает как &quot;убить&quot; синхронные запросы? У меня в консоли выходит сообщение что у...

Синхронные двигатели
В политехе на лабораторных работах по электрическим машинам запускали синхронные движки с числом...

Синхронные ScrollBox'ы
На форме лежат скроллбоксы, как сделать чтобы при прокрутке одного (вертикально, горизонтально)...

4
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
16.06.2015, 13:07 2
у Вас UDP зачем Вам таймер на отправку, в 99% случаях она будет выполнена сразу
а на счет чтения, есть же select ну или poll(если под линём)

Добавлено через 1 минуту
чтение можно завернуть в метод, в нем переводим сокет в неблокирующий режим, делаем select на чтение(тут таймер и задать) если по истечению времени нет активности на чтение, возвращаем в блокирующий режим, выходим с -1, если есть активность на чтение, читаем, переводит в блокирующий режим и возвращаем значение которое recvfrom вернет
0
3 / 3 / 2
Регистрация: 13.02.2015
Сообщений: 42
17.06.2015, 07:05  [ТС] 3
зачем Вам таймер на отправку, в 99% случаях она будет выполнена сразу
А если допустим интернет упал ? Хотя в общем в данной поделке этим конечно можно пренебречь .

завернуть в метод, в нем переводим сокет в неблокирующий режим, делаем select на чтение(тут таймер и задать) если по истечению времени нет активности на чтение, возвращаем в блокирующий режим, выходим с -1, если есть активность на чтение, читаем, переводит в блокирующий режим и возвращаем значение которое recvfrom вернет
Могу делать на неблокирующихся. Таймер через цикл допустим считать. Просто интересно почему не работает первый вариант .
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
17.06.2015, 09:41 4
там многие опции не работают, например сет размера буферов на прием и передачу
Цитата Сообщение от SmilingDog Посмотреть сообщение
А если допустим интернет упал ?
и что? у Вас что udp пакет до роутера(шлюза) не дойдет?...просто не будет ответа и все, это ж Вам не ТСР
0
3 / 3 / 2
Регистрация: 13.02.2015
Сообщений: 42
17.06.2015, 16:24  [ТС] 5
Цитата Сообщение от aLarman Посмотреть сообщение
и что? у Вас что udp пакет до роутера(шлюза) не дойдет?...просто не будет ответа и все, это ж Вам не ТСР
А и правда Стало быть неблокирующиеся .
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2015, 16:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Синхронные и асинхронные сообщения!
Объясните максимально доходчиво, простыми словами, как это работает... синхронные- это обычные без...

Синхронные действия со стилем
В данном коде при наведении на ссылку работает только картинка, фон не меняется &lt;td...

СИнхронные операции с QTcpSocket
Для выполнения синхронных операций используется код bool send_command( ... ) { QMutexLocker...

Автоматы синхронные и асинхонные
Синхронный автомат программы не запускаются. по мойму я что-то с дужками напутала. помогите...

Синхронные/асинхронные операции
Подскажите примерный паттерн для приостановки скажем бесконечного цикла, который уже запущен каким...

Литература. Синхронные и асинхронные автоматы
Поделитесь пожалуйста литературой. Необходимо написать программу работы синхронного автомата, и еще...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.