Есть проект вот с такой процедурой: Код | 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 как кидались так и кидаются. Может кто-нибудь знает почему в составе фильтра этот код не работает?
--------------------
Вежливым и адекватным предлагаю общаться на "ты".
|