Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Nastik-kum
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 16
31.07.2013, 13:29     Error 10022 в мультикаст сокете #1
Здравствуйте, подскажите, пожалуйста, в чем проблема. Задача: настроить мультикаст сокет и что-либо принять. Сначала все идет хорошо... Сокет создается, биндится, а потом при попытке подключиться к мультикаст группе выдает ошибку 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2013, 13:29     Error 10022 в мультикаст сокете
Посмотрите здесь:

Project : error PRJ0003 : Error spawning 'rc.exe C++
C++ Error 1 fatal error C1093: API call 'ImportFile' failed '0x80070003' : ErrorMessage:
fatal error LNK1318: Unexpected PDB error; OK (0) '' C++
C++ Ошибка error C2146: syntax error : missing ';' before identifier 'alph'
Error 1 error C2664: 'CharToOemW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR' C++
C++ [C++ Error] Unit1.cpp(6): E2141 Declaration syntax error
[ilink32 Error] Error: Unresolved external 'zamena (int * *) ' referenced C++
C++ Error LNK1120, error LNK2019, error LNK2028, queue

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
31.07.2013, 14:25     Error 10022 в мультикаст сокете #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));
Nastik-kum
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 16
31.07.2013, 15:04  [ТС]     Error 10022 в мультикаст сокете #3
Fyret, спасибо огромное! Заработало =)

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

Добавлено через 9 минут
Исправила - увеличила размер буфера.
Yandex
Объявления
31.07.2013, 15:04     Error 10022 в мультикаст сокете
Ответ Создать тему
Опции темы

Текущее время: 17:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru