Пятница, 29.03.2024, 14:37
Приветствую Вас Гость
Главная | UDP - Форум | Регистрация | Вход
Меню сайта
Наш опрос
Слушаете ли вы музыку?
1. Да
2. Иногда
3. Нет
Всего ответов: 25
Форма входа
Друзья сайта
Статистика
Форум
[ Новые сообщения · Участники · Правила форума · Поиск ]
  • Страница 1 из 1
  • 1
Форум » Программирование » Blitz3D » UDP
UDP
TadeusDate: Суббота, 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)
---------------------------------------------
Народ дописывать статью или нет?.. king

Сообщение отредактировал Tadeus - Воскресенье, 08.07.2007, 22:32
 
][АКЕРDate: Среда, 03.10.2007, 14:11 | Message # 2
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
Quote (Tadeus)
Народ дописывать статью или нет?..

Дописывай, оч. интересно!


Хакер это круто, хакер это класс! Небыло бы хакеров, небыло-бы НАС!!!
 
TadeusDate: Воскресенье, 14.10.2007, 17:09 | Message # 3
Аццкий Магичег
Группа: Пользователи
Сообщений: 169
Статус: Offline
Это старая версия. Новая тут:
http://blitzetcetera.org/index.php/Работа_с_Сетью_в_Blitz3D:_UDP

cool

 
][АКЕРDate: Суббота, 27.10.2007, 18:01 | Message # 4
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
Спасибо, очень интересно! smile

Хакер это круто, хакер это класс! Небыло бы хакеров, небыло-бы НАС!!!
 
ASoftwareDate: Среда, 20.02.2008, 21:37 | Message # 5
Рядовой
Группа: Пользователи
Сообщений: 15
Статус: Offline
Вопрос больше похож на задачку :)

с=ReadByte(File)
WriteByte File,c
SendUDPMsg UDP,INT_IP("128.12.12.0"),64000

Вопрос:

Сколько байт передалось?

Меня интерисует вот что (чтобы более понятно было). В протоколе UDP при передаче одного байта передается ещё куча информации, например от кого пришло, кому передается, и так далее. Сколько это всё занимает места(исключая того одного байта, который я передаю)?


..я привык каждый день уходить на войну, здесь воюют всегда за престиж за звезды и за воздух...
 
TadeusDate: Четверг, 21.02.2008, 13:46 | Message # 6
Аццкий Магичег
Группа: Пользователи
Сообщений: 169
Статус: Offline
4 байта идет на данные, остальное - на пакет
 
ASoftwareDate: Пятница, 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, - немног выигрыш есть


..я привык каждый день уходить на войну, здесь воюют всегда за престиж за звезды и за воздух...
 
Форум » Программирование » Blitz3D » UDP
  • Страница 1 из 1
  • 1
Поиск:
Copyright JohnK© 2024