В 64-битной ОС Windows7 я использую API-интерфейс qWAVE, чтобы установить значение DSCP для исходящих пакетов с обычным трафиком udp, и оно работает нормально.
Но я пытаюсь сделать то же самое для многоадресного трафика, но это выглядит странно !!
Код логического потока выглядит так:
- Создать сокет и присоединиться к многоадресной группе
- Создание другого сокета, ошибка отчета qWAVE при добавлении сокета в него
На одном ПК выполнение шага № 1 приведет к сбою шага № 2 через 10 ~ 20 секунд.
Я думаю, что проблема из-за реализации qWAVE, я не уверен. Спасибо, если есть советы.
Ниже мой код:
#include "stdafx.h"
#include <winsock2.h>
#include <qos2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"Qwave.lib")
#define GREOUP_IP "231.31.31.31"
#define LOCAL_IP "192.168.1.106" // change to local ip
int testQOS() {
WSADATA WSAData;
DWORD err = WSAStartup(MAKEWORD(2,2), &WSAData);
if (err) {
printf("WSAStartup Failed (%d) Exiting\n", err);
exit(err);
}
SOCKET hSocket = socket(AF_INET,SOCK_DGRAM,0);
if (hSocket == INVALID_SOCKET) {
printf("\"Socket\" failed with error %d\n", GetLastError());
return 1;
}
SOCKADDR_IN addr_dest;
addr_dest.sin_family = AF_INET;
addr_dest.sin_addr.s_addr = inet_addr(GREOUP_IP);
addr_dest.sin_port = htons(333);
//QOS
HANDLE m_hQOSHandle = NULL;
DWORD m_QOSLastFlowId = 0;
if (m_hQOSHandle == NULL) {
QOS_VERSION ver = {1, 0}; //major, minor
if (!QOSCreateHandle(&ver, &m_hQOSHandle)) {
printf("Could not initialize the QOS/QWave subsystem (error %d).\n", GetLastError());
return 1;
}
}
if (!QOSAddSocketToFlow(m_hQOSHandle, hSocket, (PSOCKADDR)&addr_dest, QOSTrafficTypeVoice,
QOS_NON_ADAPTIVE_FLOW, &m_QOSLastFlowId)) {
m_QOSLastFlowId = 0;
printf("Could not set QOS parameters on socket (error %d)\n.", GetLastError());
return 1;
}
shutdown(hSocket, SD_BOTH);
closesocket(hSocket);
QOSRemoveSocketFromFlow(m_hQOSHandle, hSocket, m_QOSLastFlowId, 0);
QOSCloseHandle(m_hQOSHandle);
WSACleanup();
return 0;
}
int testMultiGroup() {
WSADATA WSAData;
DWORD err = WSAStartup(MAKEWORD(2,2), &WSAData);
if (err) {
printf("WSAStartup Failed (%d) Exiting\n", err);
exit(err);
}
SOCKET hSocket = socket(AF_INET,SOCK_DGRAM,0);
if (hSocket == INVALID_SOCKET) {
printf("\"Socket\" failed with error %d\n", GetLastError());
return 1;
}
SOCKADDR_IN addr_dest;
addr_dest.sin_family = AF_INET;
addr_dest.sin_addr.s_addr = inet_addr(GREOUP_IP);
addr_dest.sin_port = htons(333);
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(GREOUP_IP);
mreq.imr_interface.s_addr = inet_addr(LOCAL_IP);
// comment below line, the code will works
setsockopt(hSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
sendto(hSocket, "test", 4, 0, (sockaddr*)&addr_dest,sizeof(SOCKADDR_IN));
shutdown(hSocket, SD_BOTH);
closesocket(hSocket);
WSACleanup();
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
// join an IP group membership
// comment below method will pass the test
// if test is failed: wait 10~20 sec or change GREOUP_IP after comment below method
// will fix the test
//if(testMultiGroup()) return 1;
// try to add socket to QOS flow
if(testQOS()) return 1;
return 0;
}