Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сервер C++ Win32 https://www.cyberforum.ru/ cpp-networks/ thread1477692.html
Добрый день! Пишу по этому видеоуроку программу сервера. Вот мой код: #pragma comment(lib, "Ws2_32.lib") #include <WinSock2.h> #include <iostream> #include <WS2tcpip.h> SOCKET Connect;...
Создать клиент, принимающий данные с использованием сокетов C++
Всем привет, пожалуйста подскажите как мне сделать КЛИЕНТ на c++, чтобы можно было передавать и получать данные(просто строки). Слово "клиент" я выделил по тому, что сервер у меня уже сделан на...
Как узнать, что компьютер пингуют в данный момент? C++
Всем добрый день! команда ping - это значит что я отправляю "пакеты" на какой-то IP а как я могу узнать что мне приходят такие пакеты? или это просто невозможно? Заранее спасибо за ответ =)
C++ Клиент серверное приложение для удаленного управления Нужна помощь в написании клиент серверной программы для удаленного управления на С++ (через командную строку). Должен быть очень простой функционал: выкл.комп, перезагрузка, завершения сеанса... https://www.cyberforum.ru/ cpp-networks/ thread1474318.html
C++ Два клиента не запускаются на одном компьютере https://www.cyberforum.ru/ cpp-networks/ thread1472570.html
При запуске двух ( вполне рабочих ) клиентов , второй выдаёт ошибку в месте где стоит функция bind. Почему и как исправить ?
C++ Получение множества сообщений на сервер
Здравствуйте. Есть программа клиент-сервер. С помощью клиента осуществляется отправка сообщений на сервер. Сервер же, получает эти сообщения и выводит их. Думаю, и так все понятно. Собственно, нужна...
Сети Петри . Любой простой пример программы с сетями Петри С++ или на других языках программирования C++
Помогите пожалуйста . Сети Петри . Любой простой пример программы с сетями Петри С++ или на других языках программирования.
C++ Монитор загруженности сети (сколько получено\отправлено байт где копать) Ребят, нужно написать простенькую программу монитор сети, подскажите где копать и куда копать. Нужно лишь чтобы программа получала сколько отправлено и получено байт через интернет или локальную... https://www.cyberforum.ru/ cpp-networks/ thread1468281.html
C++ Есть простые примеры реализации epoll на C/C++? https://www.cyberforum.ru/ cpp-networks/ thread1468242.html
Настраиваю неблокирующие сокеты... Читаю/отправляю небольшие посылки... А вот когда дело касается больших пакетов, то, как я понимаю, нужно использовать epoll. Не подскажите простенькие примеры...
C++ Написание шлюза для приложения Доброе времени суток. Возникла такая проблема. Есть приложение оно работает с базой данных. Приложение написано на java так же есть сервер linux где крутиться база этого приложения. Я хочу написать... https://www.cyberforum.ru/ cpp-networks/ thread1466354.html
3 / 3 / 2
Регистрация: 13.02.2015
Сообщений: 42
0

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

16.06.2015, 11:21. Просмотров 1235. Ответов 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
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.