Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 16

Error 10022 в мультикаст сокете

31.07.2013, 13:29. Показов 4452. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите, пожалуйста, в чем проблема. Задача: настроить мультикаст сокет и что-либо принять. Сначала все идет хорошо... Сокет создается, биндится, а потом при попытке подключиться к мультикаст группе выдает ошибку 10022 (Invalid argument). Я думаю, что проблема с адресом. Читала, что в Windows нужно писать не адрес источника мультикаста, а INADDR_ANY, к сожалению тоже не сработало. Также пыталась подключиться к группе с помощью setsockopt (закомментированный кусок) выпадает с ошибкой 10049 (Cannot assign requested address). В общем вообще не понимаю в чем проблема. Помогите, пожалуйста. Код прилагаю.
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// F_U_t_U.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#define DEFAULT_PORT "1234"
#define DEFAULT_BUFLEN 188
#include <winsock.h>
//#include <msocket.h>
 
#pragma comment(lib, "ws2_32.lib")
 
int main()
{
    int iResult = 0;
 
    WSADATA wsaData;
 
    SOCKET RecvSocket;
    sockaddr_in RecvAddr;
    sockaddr_in Remote;
 
    unsigned short Port = 1234;
 
    char RecvBuf[128];
    int BufLen = 128;
 
    sockaddr_in SenderAddr;
    int SenderAddrSize = sizeof (SenderAddr);
    int RecvAddrSize = sizeof(RecvAddr);
    //-----------------------------------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error %d\n", iResult);
        return 1;
    }
    //-----------------------------------------------
    // Create a receiver socket to receive datagrams
    RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (RecvSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error %d\n", WSAGetLastError());
        return 1;
    }
 
    const int optval = 1;
    setsockopt(RecvSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval));
    //-----------------------------------------------
    // Bind the socket to any address and the specified port.
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(Port);
    RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
 
    iResult = bind(RecvSocket, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
    if (iResult != 0) {
        wprintf(L"bind failed with error %d\n", WSAGetLastError());
        return 1;
    }
 
    //iResult = setsockopt(RecvSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&RecvAddr, sizeof(RecvAddr));
    //if (iResult != 0) {
    //  wprintf(L"join to multicast group error %d\n", WSAGetLastError());
    //  getchar();
    //  return 1;
    //}
    
 
    WSABUF wsaCalleeData={0,0};
    Remote=RecvAddr;
    //Remote.sin_family=AF_INET;
    Remote.sin_port=htons(Port);
    Remote.sin_addr.s_addr=inet_addr("239.255.10.01");
    //Join the multicast group. Note that SockM is not used to send or receive data.
    //It is used when you want to leave the multicast group. You simply call closesocket() on it.
    //
    if((RecvSocket=WSAJoinLeaf(RecvSocket,(sockaddr *)&Remote,sizeof(Remote),NULL,
        &wsaCalleeData, NULL,NULL,JL_BOTH))==INVALID_SOCKET)  //JL_SENDER_ONLY
    {
        wprintf(L"WSAJoinLeaf failed with: %d\n",WSAGetLastError());
        getchar();
        //ShowMessage(ErrStr);
        closesocket(RecvSocket);
        WSACleanup();
        return -1;
    }
 
 
    //-----------------------------------------------
    // Call the recvfrom function to receive datagrams
    // on the bound socket.
    wprintf(L"Receiving datagrams...\n");
    iResult = recvfrom(RecvSocket,
        RecvBuf, BufLen, 0, (SOCKADDR *) & RecvAddr, &RecvAddrSize);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"recvfrom failed with error %d\n", WSAGetLastError());
    }
 
    //-----------------------------------------------
    // Close the socket when finished receiving datagrams
    wprintf(L"Finished receiving. Closing socket.\n");
    iResult = closesocket(RecvSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket failed with error %d\n", WSAGetLastError());
        return 1;
    }
 
    //-----------------------------------------------
    // Clean up and exit.
    wprintf(L"Exiting.\n");
    WSACleanup();
 
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2013, 13:29
Ответы с готовыми решениями:

Windows socket error 10022: ошибка при создании сервера
при нажатии на кнопку, одна строчка выполняется ServerSocket1-&gt;Active=True; и ошибку выдает Может подключить что-то надо еще? В...

Ошибка POST запроса при многопоточности Socket Error #10022
Приложение отправляет Post запрос на mail.ru и авторизируется. Грубо говоря брут. Без многопоточности работало. Дописал многопоточность. ...

Передача сокета в поток и ошибка 10022
Делаю лабу по сетям, а именно, чат на UDP. Пишу поток для параллельного ввода/вывода Создаю поток для получения сообщений с сервера: ...

2
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
31.07.2013, 14:25
C++
1
2
    //RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    RecvSocket = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED);
И тогда сработает WSAJoinLeaf.

Или
C++
1
2
3
4
5
    ip_mreq Group;
    Group.imr_multiaddr.s_addr = inet_addr("239.255.10.01");
    Group.imr_interface.s_addr = htonl(INADDR_ANY);
 
    iResult = setsockopt(RecvSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&Group, sizeof(Group));
0
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 16
31.07.2013, 15:04  [ТС]
Fyret, спасибо огромное! Заработало =)

Добавлено через 16 минут
Если можно, хотелось бы еще задать вопрос про ошибку 10040 (Message too long), которую выбивает прога, даже если буфер размером 1024байт. Как так?

Добавлено через 9 минут
Исправила - увеличила размер буфера.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.07.2013, 15:04
Помогаю со студенческими работами здесь

Не могу обработать ошибку: Class EldSocketError SocketError # 10022
Здравствуйте! Прошу помочь, кто может: В программе UDPClient отсылает сообщение ... UDPClient.Send(text) ... Программа работает...

Мультикаст
необходимо настроить мультикаст, что бы смотреть iptv на компе. тем вроде бы в инете достаточно, но почему то не работает. инет и...

Мультикаст на 2 порта
Есть микротик на й1 порт - WAN получает по dhcp. 2й порт мастер+3,4 слэйв объединены с wlan бриджом. На бридже висит пул адресов...

мультикаст на DIR-300
где включить мультикаст на роутере Dlink DIR-300? настройки все облазил, нигде не могу найти

Мультикаст и перебрасывание портов
Всем здравствуйте. В общем - есть устройство, которое транслирует мультикаст (IP камера). Трансляция происходит на некий...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
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, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru