Сокеты просты. Никогда не слушай никого, кто говорит обратное. Просто есть несколько базовых понятий, которые ты должен понять и намотать на ус. Думай о сокетах как о телефонных звонках. Компьютер А звонит (подключается, connects) компьютеру Б как показано ниже.
В жизни: Комп А поднимает трубку и набирает номер 124.12.21.3 на телефон с номером 90 (ну мини АТС у них там стоит, зажрались буржуи - прим. перев.) В скриптах: /sockopen COMPB 124.12.21.3 90 В жизни: Комп Б отвечает и затем говорит комп А В скриптах: /sockwrite -n COMPB Привет! Классно, правда! В жизни: Комп А вешает трубку В скриптах: /sockclose COMPB
Это всё. Конечно, нужно пояснить, что здесь всё-таки происходит. Этот пример похож на глухого человека с телефоном, он не может слышать, а только говорит.
Именно поэтому нам просто необходимо событие on *:sockread
on *:SOCKREAD:COMPB:{ if ($sockerr > 0) return :nextread sockread %temp if ($sockbr == 0) return if (%temp) echo -s %temp goto nextread }
А теперь, подключаясь через сокет к компьютеру который мы назвали COMPB, можно уже слышать, что же происходит.
А теперь посмотрим, что же творится на ругом конце провода:
В жизни: COMPB ждёт звонка телефона #90 В скриптах: /socklisten ANYOLDNAME 90 В жизни: COMPB слышит звонок телефона и поднимает трубку В скриптах: On *:socklisten:ANYOLDNAME:{ echo -s Телефон звонит sockaccept $sockname COMPA sockwrite -n COMPA Привет! Это COMPB } В жизни: COMPA говорит "Привет!", а затем любая сторона может повесить трубку В скриптах: on *:SOCKREAD:*:{ if ($sockerr > 0) return :nextread sockread %temp if ($sockbr == 0) return if (Привет! isin %temp) sockclose $sockname | echo -s Мы повесили трубку if (%temp) echo -s %temp goto nextread }
Вот. Достаточно простой пример работы. А здесь более сложный пример (здесь приведены лишь основные события и алиасы, по которым можно понять работу с сокетами):
alias opsim.host { socklisten Opsim.Host 90 echo -s Wait on 90 unset %das } alias opsim.client { sockopen opsim.client $ip 90 echo -s Connect to $ip 90 }
on *:SOCKLISTEN:Opsim.Host:{ ;Turn the counters on if (%das != $null) { inc %das } if (%das == $null) { set %das 1 } echo -s $sockname receiving sockaccept $sockname $+ %das if (%das < 5) { sockwrite -n $sockname $+ %das 64167 .timer 1 1 sockopen Client $+ %das $sock($sockname).ip 64167 } if (%das > 4) { sockwrite -n $sockname $+ %das Full sockclose Client $+ %das } sockclose Client $+ %das } on *:SOCKLISTEN:Opsim.Game: { set %das1 $sockname $+ $time echo -s Server connecting to %das1 sockaccept %das1 sockwrite -n %das1 info } on *:SOCKREAD:*:{ if ($sockerr > 0) return :nextread sockread %temp if ($sockbr == 0) return if (64167 isin %temp) { socklisten Opsim.Game 64167 opsim.init(1) opsim.join.msg goto nextread } if (info isin %temp) { opsim.ssl.info $sockname } if (%temp) opsim.sckrd %temp goto nextread } alias opsim.ssl.info { sockwrite -n $1- Topic %opsim.topic sockwrite -n $1- Names $opsim.names(@#Opsim) } on *:SOCKCLOSE:*:{ echo -s $sockname Lost if ($sockname == Client1) { if ($sock(Client2)) { .sockrename Client2 Client1 } if ($sock(Client3)) { .sockrename Client3 Client2 } if ($sock(Client4)) { .sockrename Client4 Client3 } } if ($sockname == Client2) { if ($sock(Client3)) { .sockrename Client3 Client2 } if ($sock(Client4)) { .sockrename Client4 Client3 } } if ($sockname == Client3) { if ($sock(Client4)) { .sockrename Client4 Client3 } } if (Client isin $sockname) { dec %das } if (Opsim.Game isin $sockname) { echo 6*** Disconnected } } on *:START:unset %das alias opsim.sckrd { if (txt isin $1) { set %temp.var(4) $2 set %temp.var(3) $3- %opsim.spk.brackets } if (jn isin $1) { opsim.script.join $2 opsim.join.text $2- opsim.changeit } if (prt isin $1) { opsim.part.text $2- dline -l @#Opsim $fline(@#Opsim,$2,1,1) opsim.changeit } if (topic isin $1) { set %opsim.topic $2- opsim.changeit } if (names isin $1) { opsim.add.ppl2chan $2- opsim.changeit } } alias echoed { ;Game Types 0,1.. 0 = Single Player, 1 = 2+ Player if (%opsim.game.type == 0) { echo $1- } if (%opsim.game.type == 1) { opsim.ssl.poke $2- } } alias opsim.ssl.poke { if ($sock(Client1)) { sockwrite -n Client1 $1- } if ($sock(Client2)) { sockwrite -n Client2 $1- } if ($sock(Client3)) { sockwrite -n Client3 $1- } if ($sock(Client4)) { sockwrite -n Client4 $1- } }
На этом, пожалуй, и закончим
|