In Windows7 64bit OS, I use qWAVE api to set the DSCP value for outgoing packets with a normal traffic udp and it work fine.
But , I 'm trying to do the same thing for a multicast traffic, but it looks strange!!
The code logical flow like this:
- Create a socket and join an multicast group
- Create another socket, the qWAVE report error when add the socket to it
In one PC, run step #1 will let step #2 failed in 10~20 seconds. I guess the issue due to qWAVE implementation, I'm not sure. Thanks if any tips.
Below is my code:
#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;
}