|
|
  |
Сопряжение железа с ПК по Ethernet, Какие служебные протоколы необходимо реализовать |
|
|
|
Oct 10 2008, 15:35
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Aprox @ Oct 10 2008, 16:11)  Потому, что экономят кучу времени новичку... После чего новичек в лучшем случае остается новичком, а скорее всего становится ламером, который чего-то типа "сделал" хотя и не понял что. Отчего возввышается в своих глазах, но в случае чего сразу начинает валить все на глюки Windows, компиляторов и любимым занятием становится разговоры о "глюках" и поиск "безглючных компонентов". Дело в том, что именно интерфейс BSD Socket один из немногих  реально продуманных, ПРОСТЫХ и универсальных интерфейсов. Надстройками его можно только изуродовать  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 11 2008, 07:00
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(zltigo @ Oct 10 2008, 19:35)  После чего новичек в лучшем случае остается новичком, а скорее всего становится ламером, который чего-то типа "сделал" хотя и не понял что. Отчего возввышается в своих глазах, но в случае чего сразу начинает валить все на глюки Windows, компиляторов и любимым занятием становится разговоры о "глюках" и поиск "безглючных компонентов". И тем не менее, факт остается фактом- Indy компоненты в Delphi-7 (они же в билдере) у меня работают четко и предсказуемо. Проблемы есть, - они в быстродействии не знаю уж чего, то ли в виндах, то ли в компонентах. Так например, программы с компонентами UDP-сервер или UDP-клиент не могут на моем лично ПК принимать потоки данных более, чем 54 Mbps. Происходит потеря пакетов, если пытаешься грузить быстрее. Думаю, дело в задержках на графику виндов. Я это выяснил с помощью снифера WireSharck, который точно также пропускает пакеты, если ему не отключить графическую прорисовку в реальном времени. Иными словами, дело не в компонентах и не в сокетах, а в GUI виндов. Цитата(zltigo @ Oct 10 2008, 19:35)  Дело в том, что именно интерфейс BSD Socket один из немногих  реально продуманных, ПРОСТЫХ и универсальных интерфейсов. Надстройками его можно только изуродовать  . На счет простоты не соглашусь. Куча вызовов API типа accept, listen...- все это требует тщательнейшего осмысления, а запутаться, когда что вызывать и нужно ли вообще - ничего не стоит. Свежему человеку, который экономит свое время - не советую. Я уж не поминаю GUI виндов, который мгновенно сожрет все преимущества, которые были отжаты у сокетов.
|
|
|
|
|
Oct 11 2008, 08:09
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(Aprox @ Oct 11 2008, 11:00)  Проблемы есть, - они в быстродействии не знаю уж чего, то ли в виндах, то ли в компонентах. Так например, программы с компонентами UDP-сервер или UDP-клиент не могут на моем лично ПК принимать потоки данных более, чем 54 Mbps. Происходит потеря пакетов, если пытаешься грузить быстрее. Думаю, дело в задержках на графику виндов. Вот только не стоит на зеркало на винду пенять... По UDP через стандартный сокет Winsock2 и при подключении точка-точка через 100BASE-TX можно передавать поток RTP со скоростью ~100 Mbps. При этом производительности Pentium-4@3.4GHz хватает на декодирование MJPEG и отрисовку графики с помощью DirectX в реал-тайме. По TCP пробовал передавать через HTTP-сервер JPEG-картинки с отображением их в окне IE. Для четырех одновременно открытых сокетов скорость получалась ~94 Mbps, но думаю, это не предел.. С потерей пакетов не сталкивался ни разу: [attachment=25680:attachment]
Сообщение отредактировал blackfin - Oct 11 2008, 08:13
|
|
|
|
|
Oct 11 2008, 08:29
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Aprox @ Oct 11 2008, 09:00)  Иными словами, дело не в компонентах и не в сокетах, а в GUI виндов. Увы, конкретно в случае использования борлондячины дело именно в той несораизмеримой плате за "удобство" ничего не знать которую Вы платите. И чистые сокеты и тем более чистый GUI опирающиеся на, как правило, драйвера выжимающие из железа почти все, в Windows очень хороши.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 11 2008, 10:27
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121

|
Спасибо всем откликнувшимся. Как я понял из вот этого примера http://astrosurf.com/cavadore/EthernetCont...er/sources.html, для работы UDP/IP необходимо реализовать обработку ARP и ICMP эхо (он же пинг) запросов и собственно сами UDP пакеты. На данный момент остались следующие вопросы: 1. ARP запрос посылается при отправке пакета по IP адресу, для которого нет соответствующего MAC адреса в ARP таблице, и до этого момента со стороны железа не требуется отвечать на попытки ПК войти с ним в контакт? 2. В каких случаях посылается (и необходим ли вообще в моем случае) ping запрос? 3. Если на компьютере будет несколько сетевых карт, то ARP запрос пошлется во все сетевые подключения или в одно из них, если не во все то как можно выбрать в какую сетевуху его отправлять? Планирую использовать классы библиотеки QT, поэтому средства от Borland или Microsoft не интересны.
Сообщение отредактировал studert - Oct 11 2008, 10:31
|
|
|
|
|
Oct 11 2008, 11:38
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(studert @ Oct 11 2008, 12:27)  1. ARP запрос посылается при отправке пакета по IP адресу, для которого нет соответствующего MAC адреса в ARP таблице, и до этого момента со стороны железа не требуется отвечать на попытки ПК войти с ним в контакт? Это не проблема железа - BCЕ, кто знает MAC, то должены входить вне зависимости от того, откуда они его знают. Цитата 2. В каких случаях посылается (и необходим ли вообще в моем случае) ping запрос? На Ваше усмотрение. Цитата 3. Если на компьютере будет несколько сетевых карт, то ARP запрос пошлется во все сетевые подключения или в одно из них, если не во все то как можно выбрать в какую сетевуху его отправлять? Да, хоть 10 карт, но у них IP подсети разные - пойдет в соответствии с подсетью. И вообще это не проблема Вашей железки и не приложения на PC.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 11 2008, 19:21
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(blackfin @ Oct 11 2008, 12:09)  По UDP через стандартный сокет Winsock2 и при подключении точка-точка через 100BASE-TX можно передавать поток RTP со скоростью ~100 Mbps. При этом производительности Pentium-4@3.4GHz хватает на декодирование MJPEG и отрисовку графики с помощью DirectX в реал-тайме. Мой старенький ПК по сравнению с Вашим монстром- ничто. Я работаю на Pentium-4@800MHz. естественно, что винда у меня тормозит, а у Вас не тормозит на 100BASE-TX. Когда Вы перейдете на большие скорости, например 1000BASE-T, то и ваш ПК тоже начнет пропускать пакеты из-за отвлечения на GUI виндов. Цитата(zltigo @ Oct 11 2008, 12:29)  Увы, конкретно в случае использования борлондячины дело именно в той несораизмеримой плате за "удобство" ничего не знать которую Вы платите. И чистые сокеты и тем более чистый GUI опирающиеся на, как правило, драйвера выжимающие из железа почти все, в Windows очень хороши. А еще круче WinCap, который работает вообще без драйверов и сокетов на уровне ядра виндов. Hо сколько стоит сил его завести!
|
|
|
|
|
Dec 12 2008, 12:48
|
Группа: Участник
Сообщений: 6
Регистрация: 23-10-06
Пользователь №: 21 596

|
Цитата(Aprox @ Oct 11 2008, 23:21)  ... Hо сколько стоит сил его завести! ... очень мало  1. качаете WinPcap4.0.2 или WinPcap4.1beta42. качаете Developer's Pack для v4.0.2 или v4.1 beta4, соответсвенно. 3. устанавливаете то, что скачали в п.1 4. распаковываете то, что скачали в п.2. (папки - doc, examples(2), include, lib) Открываем файл WpdPack\Examples-pcap\basic_dump\basic_dump.c - пример как принимать Открываем файл WpdPack\Examples-pcap\sendpack\sendpack.c - пример как передавать Код для сендера вообще смешной: Код #include <stdlib.h> #include <stdio.h> #include <pcap.h>
int main(int argc, char **argv) { pcap_t *fp; char errbuf[PCAP_ERRBUF_SIZE]; u_char packet[100]; int i; /* Open the adapter */ if ((fp = pcap_open_live(argv[1], // name of the device 65536, // portion of the packet to capture. It doesn't matter in this case 1, // promiscuous mode (nonzero means promiscuous) 1000, // read timeout errbuf // error buffer )) == NULL) { fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", argv[1]); return 2; }
/* Supposing to be on ethernet, set mac destination to 1:1:1:1:1:1 */ packet[0]=1; packet[1]=1; packet[2]=1; packet[3]=1; packet[4]=1; packet[5]=1; /* set mac source to 2:2:2:2:2:2 */ packet[6]=2; packet[7]=2; packet[8]=2; packet[9]=2; packet[10]=2; packet[11]=2; /* Fill the rest of the packet */ for(i=12;i<100;i++) {packet[i]=i%256;} /* Send down the packet */ if (pcap_sendpacket(fp, // Adapter packet, // buffer with the packet 100 // size ) != 0) { fprintf(stderr,"\nError sending the packet: \n", pcap_geterr(fp)); return 3; }
pcap_close(fp); return 0; } ... WinPCap на любителя, но для тестирования связки железо-ПК более чем достаточна, до и очень проста для программирования, про возможности даже говорить не буду - в доках прочтите или в нете. У нас связка TMS320C6455(EMAC minidrv без NDK) <-> NoteBook (WinXP+WinPCap4.0.2) работала устойчиво, выжимали >90% 100-ки (гигабит не проверяли, т.к. DSK ограничен 100PHY)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|