Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> UDP соединение в контексте видео-фильтра 
:(
    Опции темы
EKoshelev
Дата 13.4.2011, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Есть проект вот с такой процедурой:

Код

int _tmain(int argc, _TCHAR* argv[])
{
  WSADATA wsaData;
  SOCKET RecvSocket;
  sockaddr_in RecvAddr;
  int Port = 27015;
  char RecvBuf[30000];
  int  BufLen = 30000;
  sockaddr_in SenderAddr;
  int SenderAddrSize = sizeof(SenderAddr);
  int res, err;
  unsigned long nb = 1;


  //-----------------------------------------------
  // Initialize Winsock
  WSAStartup(MAKEWORD(2,2), &wsaData);

  //-----------------------------------------------
  // Create a receiver socket to receive datagrams
  RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

  //-----------------------------------------------
  // 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);

  bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));

  err = ioctlsocket(RecvSocket, FIONBIO, (unsigned long *) &nb);
  
  //-----------------------------------------------
  // Call the recvfrom function to receive datagrams
  // on the bound socket.
  if (err) return 0;
  printf("Receiving datagrams...\n");
  do {
    res = recvfrom(RecvSocket, 
            RecvBuf, 
            BufLen, 
            0, 
            (SOCKADDR *)&SenderAddr, 
            &SenderAddrSize);
    if (res >= 0) 
    printf("Result Call recvfrom = %d \n",res);
  } while (_kbhit() == 0);
  //-----------------------------------------------
  // Close the socket when finished receiving datagrams
  printf("Finished receiving. Closing socket.\n");
  closesocket(RecvSocket);

  //-----------------------------------------------
  // Clean up and exit.
  printf("Exiting.\n");
  WSACleanup();
  return 0;

}


Если запустить, он выводит строчки типа: «Result Call recvfrom = 12345», где 12345 – это длина принятого пакета. Т. е. пакеты кидаются на 6987h (27015) и прога их ловит, т. е. работает правильно.
Пишу видео фильтр, в который закидываю аналогичный кусок кода:
Код

int _tget()
{
  WSADATA wsaData;
  SOCKET RecvSocket;
  sockaddr_in RecvAddr;
  int Port = 27015;
  char RecvBuf[30000];
  int  BufLen = 30000;
  sockaddr_in SenderAddr;
  int SenderAddrSize = sizeof(SenderAddr);
  int res, err;
  unsigned long nb = 1;
  int cnt;


  //-----------------------------------------------
  // Initialize Winsock
  WSAStartup(MAKEWORD(2,2), &wsaData);

  //-----------------------------------------------
  // Create a receiver socket to receive datagrams
  RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

  //-----------------------------------------------
  // 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);

  bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));

  err = ioctlsocket(RecvSocket, FIONBIO, (unsigned long *) &nb);
  
  //-----------------------------------------------
  // Call the recvfrom function to receive datagrams
  // on the bound socket.
  if (err) return -2;
  cnt = 1;
  do {
    res = recvfrom(RecvSocket, 
            RecvBuf, 
            BufLen, 
            0, 
            (SOCKADDR *)&SenderAddr, 
            &SenderAddrSize);

    cnt--;
  } while ((cnt >= 0) && (res < 0));
  //-----------------------------------------------
  // Close the socket when finished receiving datagrams
  closesocket(RecvSocket);

  //-----------------------------------------------
  // Clean up and exit.
  WSACleanup();

  return res;

}


Эта функция должна возвращать длину пойманного пакета, если не пойман, то -1. И вот в теле фильтра, она всегда возвращает -1, хотя пакеты на порт 27015 как кидались так и кидаются.
Может кто-нибудь знает почему в составе фильтра этот код не работает?



--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
EKoshelev
Дата 14.4.2011, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Спасибо, разобрался. Контекст видео-фильтра был здесь ни при чём.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0822 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.