Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182

UDP: Привязка сокета к адресу

09.09.2014, 21:42. Показов 2268. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хотел привязать сокет к адресу сервера, но выдает ошибку (-200). Функция запускается в отдельном потоке.
Если есть еще какие-то ошибки по логике кода, скажите, пожалуйста.
Кликните здесь для просмотра всего текста
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
// HANDLE hSender = ::CreateThread( 0, 0, (LPTHREAD_START_ROUTINE)&client::sender, 0, 0, 0 );
// char ip[16] = {217.118.83.227} вводится в TextBox. Сервер работает. Привязывает сокет только к адресу 127.0.0.1
    int sender(){
        SOCKET sender_sock = ::socket(AF_INET, SOCK_DGRAM, 0);
        if( sender_sock == INVALID_SOCKET){
            t2 = -100; // для проверки
            ::closesocket(sender_sock);
            return 2;
        }
        sockaddr_in addr;
        int addr_size = sizeof(addr);
        ::ZeroMemory(&addr,addr_size);
        addr.sin_family      = AF_INET;
        addr.sin_port        = ::htons(PORT_SERVER);
        addr.sin_addr.s_addr = ::inet_addr(ip);
        if( ::bind( sender_sock, (const sockaddr*)&addr, addr_size) == SOCKET_ERROR ){
            t2 = -200; // для проверки
            ::closesocket(sender_sock);
            return 3;
        }
        while(1){
            t2 += 10.;
            DWORD dWaitLogical = WaitForSingleObject(hMutex,INFINITE);
            if( dWaitLogical == WAIT_TIMEOUT ){
 
            }else{
                if( SelectExc( &sender_sock, 1 ) ){
                    hMutex = CreateMutex(0,1,0);
                    if( mess[0] != 0 )
                        ::send(sender_sock, (const char *)mess, BUFFER_SIZE,0);
                    ::memset(&mess,0,BUFFER_SIZE);
                    t2++;
                    ReleaseMutex(hMutex);
                    ::Sleep(100);
                }
            }
        }
        ::closesocket(sender_sock);
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.09.2014, 21:42
Ответы с готовыми решениями:

Написать соединение: много клиентов - сервер (Winsock; на сервере 3 сокета: 2 TCP и 1 UDP)
Всем здрасьте !!!! Мне надо написать соединение: много клиентов - сервер Тут мне надо иметь на сервере 3 сокета: 2 TCP и 1 UDP ...

UDP: привязка к конкретному интерфейсу и широковещательное сообщение
Возникла ситуация, когда нужно было принимающий сокет связать с конкретным интерфейсом. Связываю с помощью bind(), передавая адрес...

Входной буфер UDP сокета
Здравствуйте. Скажите, пожалуйста, существует ли отдельная функция, отвечающая за очищение входного буфера UDP сокета от всех, скопившихся...

16
Native x86
Эксперт Hardware
 Аватар для quwy
6859 / 3791 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
09.09.2014, 21:53
WSAGetLastError() что возвращает сразу после неудачного bind()?
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
10.09.2014, 10:18  [ТС]
Сначала ругался на 10049. Добавил функцию connect. Теперь ругается на 10022 и тут мне уже сложно:
WSAEINVAL
10022
Invalid argument.
Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.

Добавлено через 11 часов 58 минут
В общем, я так понял для прослушивающего сокета нужно указать ("127.0.0.1" или IN_ADDRANY):PORT
А для отправляющего IP_SERVER:PORT_SERVER. И связывать отправляющий сокет с адресом функцией connect(). Но тут теперь так возникло, что отправляющему сокету присваивается непонятно какой адрес и непонятно, куда он отправляет дейтаграммы (локальный порт для сокета показывает совершенно левый != PORT_SERVER).
0
Native x86
Эксперт Hardware
 Аватар для quwy
6859 / 3791 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
10.09.2014, 12:38
Eraston, что-то вы не то делаете. В протоколе UDP нет понятия соединения и ф-ция connect() не используется.

Цитата Сообщение от Eraston Посмотреть сообщение
В общем, я так понял для прослушивающего сокета нужно указать ("127.0.0.1" или IN_ADDRANY):PORT
Нет, сокет вполне может слушать конкретный адрес, и не обязательно это 127.0.0.1.

В интернета полно примеров простейших UDP-серверов и клиентов, откомпилируйте один из них, посмотрите как он работает, а потом возвращайтесь к своему проекту.
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
10.09.2014, 14:06  [ТС]
Большинство таких клиентов-серверов - эхо, да и то, на локальных адресах, и простейший чат в локальной среде "один написал - все получили" уже создал.
Цитата Сообщение от quwy Посмотреть сообщение
ф-ция connect() не используется.
Нет, сокет вполне может слушать конкретный адрес, и не обязательно это 127.0.0.1.
Полазил по просторам интернета... Вроде как, bind() используется для привязки сокета к локальному адресу, connect() - к внешнему. Собственно, connect() в этом случае можно применять для пользования ф-ями send() и recv().
0
Native x86
Эксперт Hardware
 Аватар для quwy
6859 / 3791 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
10.09.2014, 14:30
Цитата Сообщение от Eraston Посмотреть сообщение
Собственно, connect() в этом случае можно применять для пользования ф-ями send() и recv()
Почему бы не воспользоваться ф-циями sendto() и recvfrom(), которые предназначены специально для такого случая?
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
10.09.2014, 14:58  [ТС]
Ну так-то без разницы.. Всё равно пакеты до адресата не доходят...
С локального адреса сервер принимает пакеты...
0
Native x86
Эксперт Hardware
 Аватар для quwy
6859 / 3791 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
10.09.2014, 15:43
Цитата Сообщение от Eraston Посмотреть сообщение
Ну так-то без разницы.. Всё равно пакеты до адресата не доходят...
Так может на сервере firewall не пускает?
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
10.09.2014, 16:07  [ТС]
Брандмаузер откл.
Возможна проблема из-за того, что интернет на обоих компьютерах мобильный? (через usb-modem)
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
10.09.2014, 16:58
Цитата Сообщение от Eraston Посмотреть сообщение
что интернет на обоих компьютерах мобильный?
быть может проблема в том что Вам нужен "белый" IP для этого?)
0
Native x86
Эксперт Hardware
 Аватар для quwy
6859 / 3791 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
10.09.2014, 17:21
Цитата Сообщение от Eraston Посмотреть сообщение
Возможна проблема из-за того, что интернет на обоих компьютерах мобильный? (через usb-modem)
Может. Даже если оба адреса белые, это не значит, что у оператора нет своего firewall, который никого не пускает на вход. Очень уж часто мобильщики грешат тем, что даже ping не пропускают.
1
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
10.09.2014, 17:35  [ТС]
Спасибо. Отложим данный вопрос до появления необходимого аппаратного обеспечения.
В таком случае можно представить, что локальный адрес - сеть, а порт - ip адрес, и симулировать работу сервера и нескольких клиентов на одном компьютере?
0
Native x86
Эксперт Hardware
 Аватар для quwy
6859 / 3791 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
10.09.2014, 17:47
Цитата Сообщение от Eraston Посмотреть сообщение
В таком случае можно представить, что локальный адрес - сеть, а порт - ip адрес, и симулировать работу сервера и нескольких клиентов на одном компьютере?
Если нужно большее приближение к реальности, то возьмите любую виртуальную машину, запустите на ней несколько гостевых систем и экспериментируйте. Как настроить для этого VMWare [Player], могу подсказать.
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
10.09.2014, 18:16  [ТС]
Думаю, было бы полезно.
0
Native x86
Эксперт Hardware
 Аватар для quwy
6859 / 3791 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
10.09.2014, 18:28
Eraston, установите VMWare Player или VMWare Workstation, создайте виртуальную машину с настройками по-умолчанию, установите в ней нужную вам ОС, установите драйвера и утилиты VMWare, завершите работу гостевой системы штатным способом, перейдите в окно настроек гостевой системы и в свойствах сетевого адаптера укажите тип сети "Host-Only", закройте окно VMWare, скопируйте папку с гостевой системой столько раз, сколько клиентов вам необходимо, запустите VMWare, через меню откройте все копии установленных систем (выбирайте "copy" в появившемся окне), запустите их, и с этого момента все они смогут обращаться по сети к вашей основной системе (IP-адрес смотрим в выхлопе ipconfig по имени "Ethernet adapter VMware Network Adapter VMnet1").
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
18.09.2014, 18:37  [ТС]
В общем, проблема остается.
C++
1
2
3
4
5
6
7
8
    ::ZeroMemory( &listener_addr, listener_addr_size );
    listener_addr.sin_family = AF_INET;
    listener_addr.sin_port = ::htons( 56741 ); // SOCKET_DEFCPORT
    listener_addr.sin_addr.s_addr = ::inet_addr( INADDR_ANY );
    
    if( ::bind( listener_sock, (sockaddr*)&listener_addr, listener_addr_size) == SOCKET_ERROR ){
        hge->System_Log("Fail listener bind\nWSAError: %d\n", ::WSAGetLastError() );
    }
Кидает ошибку WSAError 10049.
C++
1
2
3
4
5
6
7
    while( 1 ){
        System_Log("L > Cicle");
        bool r = 1, e = 1, w = 0;
        if( SelectEx( listener_sock, r, w, e ) ){
            System_Log("L > Select");
            if( r ){
                System_Log("L > SelectRead");
Select проходит но (read) r = 0.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
19.09.2014, 10:05
Цитата Сообщение от Eraston Посмотреть сообщение
C++
1
listener_addr.sin_addr.s_addr = ::inet_addr( INADDR_ANY );
Eraston, нужно без вызова inet_addr()
C++
1
listener_addr.sin_addr.s_addr = ::htonl( INADDR_ANY );
INADDR_ANY - число, а не строка.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2014, 10:05
Помогаю со студенческими работами здесь

Перевод udp сокета в неблокирующий режим
Собственно как это сделать? Есть свойство Blocking которому можно присвоить значение false и потом перед каждой операцией проверять...

Привязка субъектов к адресу
Добрый день! Помогите разобраться, бьюсь 4 месяца, ума не приложу, не так силен в этой сфере. Есть база данных "Заявки" работает...

Привязка к мак адресу компьютера
Всем доброго времени суток дорогие форумчани! Вот у меня есть код что бы узнать мак адерс компьютера function GetAdapterInfo(Lana:...

Привязка для дуплексной udp связи
Не подскажите какую привязку нужно использовать в wcf для того, что бы можно было реализовать udp дуплексную службу?

роутер тплинк и привязка к мак адресу
В общем есть роутер тплинк TL-WDR4300 На нем доступ к админке был прописан только по мак адресу... Поменял материнку-соответственно и...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru