Qos (qWAVE API) для многоадресного поведения странного - PullRequest
1 голос
/ 23 марта 2012

В 64-битной ОС Windows7 я использую API-интерфейс qWAVE, чтобы установить значение DSCP для исходящих пакетов с обычным трафиком udp, и оно работает нормально.

Но я пытаюсь сделать то же самое для многоадресного трафика, но это выглядит странно !!

Код логического потока выглядит так:

  1. Создать сокет и присоединиться к многоадресной группе
  2. Создание другого сокета, ошибка отчета 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;
}
...