Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Nastik-kum
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 16
#1

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

31.07.2013, 13:29. Просмотров 1225. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2013, 13:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Error 10022 в мультикаст сокете (C++):

Исправить ошибку в WxDev-C++: Error with debugging process: GDB Error: error, No source file named main.cpp - C++
Здравствуйте товарищи! Новенький я в си, установил wxDev-C++, скомпилировал, запускаешь - работает, а чтоб пошагово отладка - не...

Error LNK1120, error LNK2019, error LNK2028, queue - C++
// свойство класса Parser queue&lt;elem*&gt;* postfix = new queue&lt;elem*&gt;; // строка, из-за которой происходит ошибка ...

Ошибка в тестовом примере: "Error 1 error C2143: syntax error : missing ';' before 'if'" - C++
#include&lt;iostream&gt; using namespace std; int main(){ int x, a = 0, b = 10; (cin &gt;&gt; x).get(); while (x){ int c = x % 10; ...

Error 1 error C2664: 'CharToOemW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR' - C++
выдает вот такую ошибку - Error 1 error C2664: 'CharToOemW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR' использую visual...

Ошибка error C2146: syntax error : missing ';' before identifier 'alph' - C++
Не получается откомпилировать прогу из консоля в MFC, выбивает ошибку error C2146: syntax error : missing ';' before identifier 'alph' ...

Причина ошибки [ilink32 Error] Error: Unable to perform link - C++
Когда сохранил программу и пытаюсь открыть ее снова то мне выкидывает ошибку Warning: Error detected (LME288) Error: Unable to...

2
Fyret
185 / 171 / 13
Регистрация: 30.07.2013
Сообщений: 359
31.07.2013, 14:25 #2
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
Nastik-kum
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 16
31.07.2013, 15:04  [ТС] #3
Fyret, спасибо огромное! Заработало =)

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

Добавлено через 9 минут
Исправила - увеличила размер буфера.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2013, 15:04
Привет! Вот еще темы с ответами:

[ilink32 Error] Error: Unresolved external 'zamena (int * *) ' referenced - C++
Вот это программа не работает : вот ошибка которую выдает компилятор: Error: Unresolved external 'zamena(int * *)' referenced from...

C:\Dev-Cpp\Makefile.win [Build Error] [Безымянный1.o] Error 1 - C++
C:\Dev-Cpp\Makefile.win Error 1 компилятор стал показывать такую ошибку, после того как я открыл эту папку редактором и удалил от...

Error 1 fatal error C1093: API call 'ImportFile' failed '0x80070003' : ErrorMessage: - C++
// Lab7_1.cpp : main project file. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; float y; void...

Error C2760: синтаксическая ошибка / Fatal error C1004: непредвиденное обнаружение конца файла - C++
Набыдлокодил следующее: Graph.h template&lt;class D&gt; class Graph { private: class Edge { private: int v1, v2;


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

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

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