在 Windows7 64 位操作系统中,我使用 qWAVE api 为具有正常流量 udp 的传出数据包设置 DSCP 值,它工作正常。
但是,我正在尝试对多播流量做同样的事情,但它看起来很奇怪!
代码逻辑流程如下:
- 创建套接字并加入多播组
- 再创建一个socket,添加socket时qWAVE报错
在一台 PC 上,运行第 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;
}