RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Ответить на сообщение
Имя:
e-mail:
FIDO:
Home page:
сохранить данные о вас
Тема:
> Требовалось мне написать утилу, которая посылает в сеть бродкастом > максимальное число IPX пакетов. Пробовал использовать tli и nwsipx32. > Главная полученная проблема - _несоответствие_ отправляемого > программой количества пакетов, количества пакетов, извлекаемых из > сети и здравым смыслом :) Для отлова пакетов использовались network > monitor из ЭнТи , а также самопальная досовая по Фролову :) > Хочется поинтересоваться в чем может быть проблема - я тут > начинаю грешить на драйверы :( > Технические подробности: > Введение - писалось под ВАК 3.08, сеть 10М > 1. TLI интерфейс. > Делал так - поскипал многое, кроме идеи > ********************************************************* > NetHandler = t_open("/dev/nipx", O_RDWR, NULL); > if (-1 == NetHandler) > { > } > > rc = t_blocking(NetHandler); > if (0 != rc) > { > } > > /* Определяем свой МАС адрес и привязка к сокету */ > t_bind(NetHandler, NULL, bind); > > while(1) > { > rc = t_sndudata(NetHandler, unitdata); > if (rc) > { > t_error("Send Data Error: "); > break; > } > DosSleep(0); > } > ************************************************************ > В цикле я определял, сколько пакетов отправлялось в секунду и > выводил на экран эту интенсивность. Играл размером пакета. > Результаты: > Пакеты по 5 байт Интенс=19341 пак\сек Здравый смысл - не более 14000 > Пакеты по 500 байт Интенс=25755 пак\сек Здравый смысл - не меняется > Вобщем хрень - ни ошибок, ничего :((( > > 2. nwsipx32 > 2.1 пробую создать блокирующий tcb > ************************************************************************************ > PNWTCB pNwtcb; > retcode = NWSipxOpenSocket( > SIPX_SOCK_CHECKSUM, > SIPX_DEFAULT_SUBNETWORK, > pSocket, > pSockHandle); > if (SIPX_SUCCESSFUL != retcode) > { > printf("OpenSocketError: %x\n", retcode); > exit(0); > } > retcode = NWSipxAllocControlBlock (SIPX_BLOCKING, NULL, (PPNWTCB)&pNwtcb); > if (SIPX_SUCCESSFUL != retcode) > { > printf("Alloc Error %x\n", retcode); > exit(0); > } > UCHAR buffer[500] = {0}; > FRAGMENT tempfrag; > tempfrag.FAddress = buffer; > tempfrag.FLength = (SizePacket > sizeof(buffer))? sizeof(buffer) : SizePacket; > pNwtcb->TCBFragmentCount = 1; > pNwtcb->TCBFragmentList = &tempfrag; > > pNwtcb->TCBSockHandle = SockHandle; > pNwtcb->TCBRemoteAddress.NAType = TA_IPX_SPX; > pNwtcb->TCBRemoteAddress.NALength = sizeof(IPXADDR); > pnuint8 temp = pNwtcb->TCBRemoteAddress.NAAddress.NAIpxAddress.NANet; > memmove (temp, "\x00\x00\x00\x00", 4); > temp = pNwtcb->TCBRemoteAddress.NAAddress.NAIpxAddress.NANode; > memmove (temp, "\xff\xff\xff\xff\xff\xff", 6); > temp = pNwtcb->TCBRemoteAddress.NAAddress.NAIpxAddress.NASocket; > memmove( temp, "\x45\x68", 2); > while(1) > { > retcode = NWSipxSendDatagram (pNwtcb); > if ((SIPX_SUCCESSFUL != retcode) || (SIPX_SUCCESSFUL != > pNwtcb->TCBFinalStatus)) > { > printf("Send Err = %lx \n", retcode); > exit(0); > } > DosSleep(0); > }//end of while(1) > *********************************************************************** > Результат > Пакеты по 5 байт Интенс: около 10000 пак\сек Получаем: около 10000 > Пакеты по 500 байт Интенс: около 11000 пак\сек ( !возросло) Получаем: > около 2000 > Странновато несколько :((( > > 2.2 пробую создать tcb, чтобы ждать окончания запроса > ****************************************************************** > PNWTCB pNwtcb; > retcode = NWSipxOpenSocket( > SIPX_SOCK_CHECKSUM, > SIPX_DEFAULT_SUBNETWORK, > pSocket, > pSockHandle); > if (SIPX_SUCCESSFUL != retcode) > { > printf("OpenSocketError: %x\n", retcode); > exit(0); > } > retcode = NWSipxAllocControlBlock (SIPX_API_EVENT, NULL, > (PPNWTCB)&pNwtcb); > if (SIPX_SUCCESSFUL != retcode) > { > printf("Alloc Error %x\n", retcode); > exit(0); > } > UCHAR buffer[500] = {0}; > FRAGMENT tempfrag; > tempfrag.FAddress = buffer; > tempfrag.FLength = (SizePacket > sizeof(buffer))? sizeof(buffer) : SizePacket; > pNwtcb->TCBFragmentCount = 1; > pNwtcb->TCBFragmentList = &tempfrag; > > pNwtcb->TCBSockHandle = SockHandle; > pNwtcb->TCBRemoteAddress.NAType = TA_IPX_SPX; > pNwtcb->TCBRemoteAddress.NALength = sizeof(IPXADDR); > pnuint8 temp = pNwtcb->TCBRemoteAddress.NAAddress.NAIpxAddress.NANet; > memmove (temp, "\x00\x00\x00\x00", 4); > temp = pNwtcb->TCBRemoteAddress.NAAddress.NAIpxAddress.NANode; > memmove (temp, "\xff\xff\xff\xff\xff\xff", 6); > temp = pNwtcb->TCBRemoteAddress.NAAddress.NAIpxAddress.NASocket; > memmove( temp, "\x45\x68", 2); > > while(1) > { > retcode = NWSipxSendDatagram (pNwtcb); > if (SIPX_PENDING != retcode) > { > printf("Send Err = %lx \n", retcode); > exit(0); > } > > retcode = NWSipxWaitForSingleEvent (pNwtcb, SIPX_INFINITE_WAIT); > if (SIPX_SUCCESSFUL != retcode) > { > printf("Wait Error %x\n", retcode); > fflush(stdout); > exit(0); > } > > DosSleep(0); > }//end of while(1) > ************************************************************************ > Результат > Пакеты по 5 байт Интенс: около 3000 пак\сек Получаем: около 3000 - > разница примерно 100 пак\сек > Пакеты по 500 байт Интенс: около 2800 пак\сек Получаем: около 2100 - > разница около 700 пак\сек(!!!) > > Вопрос: где мне выпрямить руки и как написать нужную мне утилу? > > Заранее спасибо. >
__, _, __, _,_ _, _
|_ / \ |_) | | |\/|
| \ / | \ | | | |
~ ~ ~ ~ `~' ~ ~
Programmed by
Dmitri Maximovich
,
Dmitry I. Platonoff
,
Eugen Kuleshov
.
25.09.99 (c) 1999,
RU/2
. All rights reserved.
Rewritten by
Dmitry Ban
. All rights ignored.