Наш опрос |
Слушаете ли вы музыку?
Всего ответов: 25
|
Статистика |
|
|
Форум |
|
UDP
| |
Tadeus | Date: Суббота, 22.09.2007, 19:58 | Message # 1 |
Аццкий Магичег
Группа: Пользователи
Сообщений: 169
Статус: Offline
| Итак, здесь я буду вам рассказывать о такой прекрасной вещи, как UDP. UDP - это сетевой протокол, поддерживающий негарантируемую передачу данных. Из-за негарантийности доставки, это добавляет ему скорости, а значит, его целеобразно использовать в шутерах. Однако, если постаратся, то можно сделать так называемый "гарантированный UDP". Для начала я обьясню парочку нюансов. Во-первых сетевая архитектура. UDP использует архитектуру "peer-to-peer".Для тех кто не знает: тут у нас нет, ни клиентов, не сервера, то есть все одновременно являются И клиентами, И серверами. Вот так. Во-вторых для каждого подключающего нужно выделить отдельный порт. Порт - это то, через что идут все данные по Сети. Нумерация портов идет от 1, до 65536. Однако, не надо использовать системные порты - это может вызвать проблемы. Так что лучше использовать либо 80(иногда!), либо больший чем 1024. Ну, теперь приступим. udp=CreateUDPStream(8080) While Not KeyHit(1) If RecvUDPMsg() Then While Not Eof(udp) Print ReadLine$(udp) Wend EndIf Wend Итак, что же делает эта программа? Первой строкой мы инициализируем сетевой поток на порту 8080. Далее, мы создаем цикл, выйти из которого можно нажатием на клавишу Esc. В течении цикла мы командой RecvUDPMsg проверяем пришел ли пакет данных. Если пришел - считываем до конца и выводим на экран. Это так сказать, программа-клиент чтоли. Хотя, как говорилось, в UDP нет клиентов Оставайтесь с нами! Тэкс, продолжим наш титанический труд Сейчас разберем несколько еще нюансов. Блиц использует целые ИП-адресса, то есть не те, что с точками, а без точек ла и превращенных в нечто другое Для этого есть следующая функция: Code Function Int_IP(IP$) d1%=Left(IP$,Instr(IP$,".")-1):IP$=Right(IP$,Len(IP$)-Instr(IP$,".")) d2%=Left(IP$,Instr(IP$,".")-1):IP$=Right(IP$,Len(IP$)-In str(IP$,".")) d3%=Left(IP$,Instr(IP$,".")-1):IP$=Right(IP$,Len(IP$)-Instr(IP$,".")) d4%=IP$ Return (d1 Shl 24) + (d2 Shl 16) + (d3 Shl 8 ) +d4 End Function Далее, надо узнать какой ИП-адресс у вас. Для этого я использую вот такую функцию: Code Function GetMyIP$() chips=CountHostIPs("") Return DottedIP$(HostIP(1)) End Function Вообще-то, таким образом узнается только внутренний адресс, но нам вроде другого и не надо. Разве что с прокси там куча проблем. Ну да ладно. Теперь обьясню термин "пакет". Пакет - это набор данных, отправляющиихся пользователям. О как Принцип таков - мы пишем данные постепенно как будто в файл, а затем используем команду SendUDPMsg. Сейчас я вам дам код, отправляющий клиенту текст, а вы должны разобратся. Не мне же все обьяснять Code udp=CreateUDPStream(8080) ip$="127.0.0.1" d_ip=Int_IP(ip$) While Not KeyHit(1) msg$=Input() WriteLine udp,msg$ SendUDPMsg udp,d_ip Wend End Единственное скажу: 127.0.0.1 - это адрес, который ВСЕГДА обозначает ВАШУ машину. И все же оставайтесь с нами Итак, вы разобрались? Если да - продолжаем, нет - посмотрите справку, так уж вы точно должны все понять. Сейчас я расскажу еще о парочке полезных приемов - они вам очень пригодятся. Давайте посмотрим на такие команды как UDPMsgIP и UDPMsgPort. Это весьма и весьма полезные команды. Первая позволяет узнать ИП-адресс, с которого пришло сообщение, а вторая порт сообщения. Если с первой все понятно, то некоторые спросят: а зачем нам вторая? Как я уже раньше писал - для каждого подключенного к потоку нужен свой порт. А значит для каждого надо будет создавать поток.Например, так: Code Type Player Field ip,port,str End Type While Not KeyHit(1) If RecvUDPMsg() Then p.Player=New Player p\ip=UDPMsgIp p\port=UDPMsgPort p\str=CreateUDPStream(p\port) EndIf Wend Здесь мы сначала создаем тип игрока с параметрами такими, как ИП,порт и поток. Когда мы принимаем сообщения, вы записываем в тип ИП и порт откуда пришло сообщение и создаем для этого игрока отдельный поток. Сегодня урок был коротким. Зато важный. В следующий раз, мы попробуем сделать игру, где два кубика бегают . Оставайтесь с нами Добавлено (22.09.2007, 19:58) --------------------------------------------- Народ дописывать статью или нет?..
Сообщение отредактировал Tadeus - Воскресенье, 08.07.2007, 22:32 |
|
| |
][АКЕР | Date: Среда, 03.10.2007, 14:11 | Message # 2 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Quote (Tadeus) Народ дописывать статью или нет?.. Дописывай, оч. интересно!
Хакер это круто, хакер это класс! Небыло бы хакеров, небыло-бы НАС!!!
|
|
| |
Tadeus | Date: Воскресенье, 14.10.2007, 17:09 | Message # 3 |
Аццкий Магичег
Группа: Пользователи
Сообщений: 169
Статус: Offline
| Это старая версия. Новая тут: http://blitzetcetera.org/index.php/Работа_с_Сетью_в_Blitz3D:_UDP
|
|
| |
][АКЕР | Date: Суббота, 27.10.2007, 18:01 | Message # 4 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Спасибо, очень интересно!
Хакер это круто, хакер это класс! Небыло бы хакеров, небыло-бы НАС!!!
|
|
| |
ASoftware | Date: Среда, 20.02.2008, 21:37 | Message # 5 |
Рядовой
Группа: Пользователи
Сообщений: 15
Статус: Offline
| Вопрос больше похож на задачку с=ReadByte(File) WriteByte File,c SendUDPMsg UDP,INT_IP("128.12.12.0"),64000 Вопрос: Сколько байт передалось? Меня интерисует вот что (чтобы более понятно было). В протоколе UDP при передаче одного байта передается ещё куча информации, например от кого пришло, кому передается, и так далее. Сколько это всё занимает места(исключая того одного байта, который я передаю)?
..я привык каждый день уходить на войну, здесь воюют всегда за престиж за звезды и за воздух...
|
|
| |
Tadeus | Date: Четверг, 21.02.2008, 13:46 | Message # 6 |
Аццкий Магичег
Группа: Пользователи
Сообщений: 169
Статус: Offline
| 4 байта идет на данные, остальное - на пакет
|
|
| |
ASoftware | Date: Пятница, 07.03.2008, 12:16 | Message # 7 |
Рядовой
Группа: Пользователи
Сообщений: 15
Статус: Offline
| Меня собстно вот что расстраивает: Когда передаешь файл таким вот образом: While not eof(fie) с=ReadByte(File) WriteByte File,c SendUDPMsg UDP,INT_IP("128.12.12.0"),64000 wend то получается я передаю только один (нужный мне) байт, а передается в пять раз больше. Из-за этого существенно падает скорость передачи. =(Добавлено (01.03.2008, 13:57) --------------------------------------------- Подожди, а как может так быть? Всего 4 байта? Если включается в пакет адрес отправителя, адрес получателя, порт отправителя, порт получателя, заголовок...Всё в целочисленном виде...IP в целочисленном виде представляется числом из 10 цифр. Каждый символ - 1 байт. Т.е. Порт отправ.+ порт получателя + INT_IP(dest)+INT_IP(send)+Заголовок... Т.е. 5байтов приходится на порт (я так думаю) Т.е. 5+5+10+10+Заголовок(я не знаю сколько он занимает) = больше 30 байт. Да в пакет может не включатся адрес отправителя, или порт отправителя, но там явно больше чем 4 байта...Вот и вся проблема у меня - принимаю всего байт, а передаю явно больше чем 1 байт....Как решить проблему - прямо незнаю. Добавлено (07.03.2008, 12:16) --------------------------------------------- Можно конечно и использовать ReadInt, - немног выигрыш есть
..я привык каждый день уходить на войну, здесь воюют всегда за престиж за звезды и за воздух...
|
|
| |
|
|