RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : NWSDK - проблема


Список сообщений | Написать новое | Ответить на сообщение | Домой Поиск:
Предыдущее сообщение | Следующее сообщение
From : Igor Saveliev
To : All
Subj : NWSDK - проблема

Требовалось мне написать утилу, которая посылает в сеть бродкастом
максимальное число 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 пак\сек(!!!)

Вопрос: где мне выпрямить руки и как написать нужную мне утилу?

Заранее спасибо.


Mon 03 Dec 2001 18:39 Mozilla/4.0 (compatible; MSIE 5.0; OS/2)




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.