Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Тестер соединения по LAN


Автор: Johen 11.5.2005, 12:27
Нужна помощь.
Было заказано сделать тестер соединения по сети типа LAN.

От проги требуется реализовать 4-х ступенчатую проверку соединения между двумя компами. Соответственно, один из них - сервер, другой - клиент.

Должно быть произведено 4 теста:

1. Файл-файл
2. Файл-буфер
3. Буфер-файл
4. Буфер-буфер

Каждый из тестов - в обе стороны, т.е. клиент->сервер и обратно.

Для проведения тестов будут сгенерированны энное число тестовых файлов разного размера.

Пример первого теста. Нужно выяснить скорость соединения клиент->сервер и обратно допустим при передаче 20 мегабайтового файла. Здесь все просто: фиксируем время начала теста, копируем с клиент-машины на сервер-машину в заранее расшаренный каталог этот файл, фиксируем время окончания теста, делим размер файла на прошедшее время и получаем искомый результат. Здесь появляется первая проблема. Все тесты с использованием файлов должны быть 3-х типов: передача по IP (\\192.168.0.1\check), по NetBIOS-имени (\\TESTSERV\check) и по dns (\\test.serv\check). Как получить, используя WinAPI, NetBIOS имя с WINS-сервера по IP?

Да и еще. Тест файл-файл как и остальные тесты проводиться в обе стороны. Допустим, я сначала копирую файл с клиентской машины на машину-сервер, а потом заставляю сервак кинуть этот файл обратно на мою машину. Или еще проще: делаю в направлении клиент-сервер подряд три теста типа файл-файл, используя разные типы адресации, указанные выше. Используется один тестовый файл. Вот здесь встает одна, но очень большая проблема - системное файловое кеширование. Как обойти ее?

Вообще программа-тестер состоит из клиента и сервера. Сервер устанавливается в виде сервиса на тестируемую машину (например на файл-сервер). Перед началом тестов происходит соединение через сокеты клиента и сервера. Эта система (клиент-сервер) нужна для реализации тестов с использованием буферов. В этих типах тестов должны быть реализованы две передачи данных: блочная передача и поток. Блочная передача понятна: функция send(). А вот как реализуется поток? Я что-то слышал про HANDLE, вот только что это и с чем его едят (т.е. как прикрутить к сокетам)?

P.S. И еще один маленький вопрос. Вроде в сокетах есть функция передачи файла... Что это за функция и как ей пользоваться?

Автор: knave 11.5.2005, 18:17
Я так понимаю работаь тестилка должна только в локалке? Ели да, то CreateFile откроет тебе файл по любому из возможных вариацим имен в локалке. Ну а там дело техники, можно читаь из одного писать в другой, либо использовать CopyFile.

1. Файл-файл - Можно просто CopyFile или руками, из одного читаеш в другой пишеш через CreateFile, ReadFile, WriteFile
2. Файл-буфер - чтение удаленного файла, CreateFile, ReadFile
3. Буфер-файл - запись удаленного файла CreateFile, WriteFile
4. Буфер-буфер - CreateNamedPipe на клиенте и сервере, затем на одном конце пишеш блок в канал, WriteFile, на другом читаеш из канала ReadFile и пишеш в память.

Если же тебе надо все сделать через сокеты, руками, тогда файлы будут локальными (для клиента и сервера) и надобности в именах сетевых ресурсов нет. Законектился к сереву по IP (или получил его через gethostbyname() через имя, интернет или локалки одинаково). Ну и читай файл в буфер и пиши из буфера в сокет, на том конце из сокета читай в буфер а из него пиши в файл. По сути Буфер-буфер, это частный случай файл - файл.

Насчет потока неясно, поток это вообще абстрактное понятие и описанный выше способ пердачи тоже можно считать потоком.

Вообще никаких копироволок файлов в СОКЕТАХ нет и быть не может. CreateFile и все остальные API функции кторые могут передавать даные между компами в локалке используют сокеты. У XP есть сервис СЕРВЕР - елси его вырубить то с локалкой кроме как через сокеты работь не сможеш. Это он занимается пересылкой всех данных между компами при использовании RPC, каналов и функций кторые могут передавать данные на удаленный комп в локалке или интернете (через VPN например). Скеты при этом работаь будут, так как каждое приложение кторое использует сокеты само является сервером или колиентом.

Автор: Plamenk 12.5.2005, 08:12
Мне кажется, что от программы требуется просто тестировать разные способы передачи по IP - использовать Socket,
по NetBIOS - соответственно NetBIOS, а по dns (\\test.serv\check) - WinInet, т.е. HTTP.

Хотя я могу ошибаться. smile

Автор: Johen 12.5.2005, 13:39
2knave:
Это все так. Большая часть именно так и будет реализована.

2Plamenk:
Ты не прав. От программы требуется тестировать способы передачи данных, которые использует система во время своих рутинных операций. Во всех возможных вариациях. Причина, из-за которой я должен проводить тесты по трем типам адресов - проверка скорости получения IP-адреса машины (удаленной) по сравнению с его явным указанием (\\192.168.0.1\check).

Открытые вопросы:
1. Как обойти кеширование файлов системой?
2. Как получить NetBIOS имя машины по ее IP, используя WINS-сервер?

Автор: Johen 12.5.2005, 14:57
Цитата
Вообще никаких копироволок файлов в СОКЕТАХ нет и быть не может.


А как насчет функции TransmitFile из Winsock2 ?

Автор: knave 12.5.2005, 15:06
Цитата
А как насчет функции TransmitFile из Winsock2 ?

Да это неболее чем обертка для send и recv. Хотя можо и через нее посылать.

имя по IP gethostbyaddr()
IP по имени gethostbyname()
gethostname() имя текущей машины.

Автор: Johen 12.5.2005, 15:45
Но gethostbyaddr() возвращает dns-имя... Или я не прав?

Автор: Plamenk 13.5.2005, 08:20
Получение NetBIOS имени см. http://firststeps.ru/mfc/net/netbios/netbios1.html.

Автор: Johen 13.5.2005, 16:06
Данные статьи не подходят. smile Там описан способ получения NetBIOS-имени только своего компа, а нужно любого в сети, причем обращатся надо именно к WINS серверу. Обращение по IP к искомой машине и вытаскивание с нее имени также не подходит.

Автор: Coocky 14.5.2005, 22:47
Тебе тоьлко АПИ или МФС можно?

Автор: knave 16.5.2005, 13:46
А я вообще непонимаю, зачем так цепляться к разным именам если в конечном итоге перед тем ка установитьсоеденение все имена преобразуются в IP. Полчил IP и тестируй себе скорость. Разве что для того что бы сравнить скорость получения имени от днс и нетбиоса???

Автор: Johen 20.5.2005, 14:31
Именно. Еще надо оттестировать скорость получения имен.

2Coocky: только АПИ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)