| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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. Хотя я могу ошибаться. |
| Автор: 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 | ||
Да это неболее чем обертка для 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 |
| Данные статьи не подходят. |
| Автор: Coocky 14.5.2005, 22:47 |
| Тебе тоьлко АПИ или МФС можно? |
| Автор: knave 16.5.2005, 13:46 |
| А я вообще непонимаю, зачем так цепляться к разным именам если в конечном итоге перед тем ка установитьсоеденение все имена преобразуются в IP. Полчил IP и тестируй себе скорость. Разве что для того что бы сравнить скорость получения имени от днс и нетбиоса??? |
| Автор: Johen 20.5.2005, 14:31 |
| Именно. Еще надо оттестировать скорость получения имен. 2Coocky: только АПИ. |