Kuwii
Si kooban
Maqaalku wuxuu ka hadlayaa aasaaska gudbinta xogta la isku halleyn karo, wuxuu hirgeliyaa tusaalooyin ku saabsan
Habka lakabka gaadiidka
Waxay bixisaa xidhiidh macquul ah oo ka dhexeeya hababka codsiga ee ku socda martigaliyayaasha kala duwan. Marka laga eego dhinaca codsiga, isku xirka macquulka ah wuxuu u eg yahay kanaal si toos ah ugu xira hababka.
Tan waxa lagu sameeyaa iyada oo loo kala qaybiyo (haddii loo baahdo) fariimaha lakabka codsiga qaybo jajab ah oo lagu daro madax lakabka gaadiidka mid kasta oo iyaga ka mid ah.
Lakabka gaadiidku wuxuu markaas u gudbiyaa qaybta lakabka shabakadda soo-diraha, halkaas oo qaybta ay ku duuban tahay xirmo lakabka shabakadeed (datagram) oo loo diro. Dhamaadka helitaanka, lakabka shabakadu waxay ka soo saartaa qaybta lakabka gaadiidka ee xogta oo u gudbisa lakabka gaadiidka. Marka xigta, lakabka gaadiidka ayaa socodsiiya qaybta la helay si xogteeda ay u noqoto mid la heli karo codsiga helitaanka.
Mabaadi'da gudbinta xogta lagu kalsoonaan karo
Gudbinta xogta lagu kalsoonaan karo oo ku saabsan kanaal gebi ahaanba ammaan ah
Kiiska ugu fudud. Dhinaca dirista waxay si fudud uga helaysaa xogta lakabka sare, waxay abuurtaa baakidh ay ku jirto, waxayna u dirtaa kanaalka.
Server
package main
import (
"log"
"net"
)
func main() {
// IP-адрес сервера и порт
serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
if err != nil {
log.Fatal(err)
}
// создаем сокет с портом
serverConn, err := net.ListenUDP("udp", serverAddr)
if err != nil {
log.Fatal(err)
}
// отложенное закрытие соединения
defer serverConn.Close()
// создаем буфер для данных
buf := make([]byte, 1024)
// ждем соединение
for {
// читаем запрос
n, addr, err := serverConn.ReadFromUDP(buf)
// передаем данные в ВЕРХНИЙ уровень: в нашем случае stdout
println(string(buf[0:n]), " form ", addr.IP.String())
if err != nil {
log.Fatal(err)
}
// ответа нет, т.к. это UDP + надежный канал
}
}
Macaamiil
package main
import (
"fmt"
"log"
"net"
"time"
)
func main() {
// IP-адрес сервера и порт
serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
if err != nil {
log.Fatal(err)
}
// локальный IP-адрес и порт
localAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
if err != nil {
log.Fatal(err)
}
// установка соединения
conn, err := net.DialUDP("udp", localAddr, serverAddr)
if err != nil {
log.Fatal(err)
}
// отложенное закрытие соединения
defer conn.Close()
for {
// получение данных от ВЕРХНЕГО уровня
fmt.Print("Введите строчное предложение > ")
var msg string
_, err := fmt.Scanf("%s", &msg)
if err != nil {
log.Fatal(err)
}
// передается поток байт, а не строка
buf := []byte(msg)
// запись (передача) в соединение
_, err = conn.Write(buf)
if err != nil {
log.Fatal(err)
}
// 1 секундочку
time.Sleep(time.Second * 1)
}
}
Xogta lagu kalsoonaan karo oo lagu gudbiyo kanaalka oo leh khaladaad suurtagal ah
Talaabada xigta waa in la qiyaaso in dhammaan baakadaha la kala qaado loo helo sida ay u kala horreeyaan, laakiin qashinka iyaga ku jira ayaa laga yaabaa in la kharribmo sababtoo ah xaqiiqda ah in kanaalka mararka qaarkood uu gudbiyo xogta iyada oo qalloocan.
Xaaladdan, hababka soo socda ayaa loo isticmaalaa:
- ogaanshaha qaladka;
- jawaab celin;
- dib u gudbinta.
Nidaamyada wareejinta xogta ee lagu kalsoonaan karo ee leh habab isku mid ah oo lagu soo celiyo gudbinta marar badan ayaa loo yaqaan borotokoolka Ku celiska ReQuest (ARQ).
Intaa waxaa dheer, waxaa habboon in la tixgeliyo suurtagalnimada khaladaadka ku jira rasiidhada, marka qaybta qaata aysan heli doonin wax macluumaad ah oo ku saabsan natiijooyinka wareejinta xirmada ugu dambeysa.
Xalka dhibaatadan, oo sidoo kale loo isticmaalo TCP, waa in lagu daro goob cusub xirmada xogta oo ka kooban lambarka isku xigxiga ee xirmada.
Xogta lagu kalsoonaan karo oo lagu gudbiyo kanaal aan la isku halayn karin oo ay ku xiran tahay baakad qalloocan iyo luminta
Iyada oo ay weheliso qallooca, nasiib daro, waxaa jira khasaare baakidh ah ee shabakada.
Si loo xaliyo dhibaatadan, hababka ayaa loo baahan yahay:
- go'aaminta xaqiiqda luminta baakidhka;
- dib u geynta baakadaha lumay ee loo dhiibay xisbiga.
Intaa waxaa dheer, marka lagu daro luminta xirmada, waxaa lagama maarmaan ah in la bixiyo suurtagalnimada luminta rasiidka ama, haddii aysan waxba lumin, gaarsiinteeda dib u dhac weyn. Dhammaan kiisaska, wax la mid ah ayaa la sameeyaa: baakadda ayaa dib loo soo gudbiyaa. Si loo xakameeyo wakhtiga, farsamadani waxay isticmaashaa saacada tirinta, kaas oo kuu ogolaanaya inaad go'aamiso dhamaadka muddada sugitaanka. Markaa xirmada
// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
defaultTCPKeepAlive = 15 * time.Second
)
Dhanka wax diraya waxay u baahan yihiin inay bilaabaan saacad kasta mar kasta oo baakidh la gudbiyo (labadaba mar iyo mar labaadba), ka xakamayso joojinta saacada oo joojiso.
Markaa, waxaanu barannay fikradaha muhiimka ah ee hab-maamuuska wareejinta xogta ee la isku halayn karo:
- jeegaggu;
- tirooyinka isku xigxiga ee xirmooyinka;
- saacadaha;
- rasiidhada togan iyo kuwa taban.
Laakiin intaas oo dhan maaha!
Hab-maamuuska wareejinta xogta lagu kalsoonaan karo oo leh dhuumo qaadasho
Kala duwanaanshiyaha aan horay u tixgelinnay, nidaamka gaarsiinta la isku halayn karo waa mid aan waxtar lahayn. Waxay bilaabataa inay "gaabiso" gudbinta ay bixiso kanaalka isgaadhsiinta marka RTT uu kordho. Si loo kordhiyo waxtarkeeda oo si wanaagsan looga faa'iidaysto awoodda kanaalka isgaarsiinta, dhuumaha ayaa la isticmaalaa.
Isticmaalka tuubada tuubada waxay keenaysaa:
- kordhinta tirada tirooyinka isku xigxiga, maadaama dhammaan baakadaha la soo diray (marka laga reebo dib u gudbinta) ay tahay in si gaar ah loo aqoonsado;
- Baahida loo qabo in la kordhiyo bakhaarrada dhinaca gudbinta iyo qaabilaadda.
Tirada isku xigxiga iyo shuruudaha cabbirka kaydinta waxay ku xiran tahay ficillada hab-maamuusku uu ka jawaabo musuqmaasuqa, luminta, iyo daahitaanka xirmada. Marka laga hadlayo dhuumaha, waxaa jira laba hab oo lagu saxo khaladaadka:
- soo celi baakooyinka N dib;
- ku celcelin doorasho.
Baakadaha N dib ugu noqoshada - borotokoolka daaqada simbiriirixan
Soo diruhu waa inuu taageeraa saddex nooc oo dhacdooyin ah:
- wac hab-maamuus heer sare ah. Marka shaqada diritaanka xogta loo yaqaan "laga bilaabo korka", dhinaca soo diraya marka hore waxay hubinayaan heerka buuxinta daaqada (taas oo ah, joogitaanka fariimaha N la soo diray ee sugaya helitaanka rasiidhada). Haddii daaqadu madhan tahay, baakidh cusub ayaa la soo saaray oo la kala qaadaa, qiyamka doorsoomayaasha waa la cusboonaysiiyaa. Haddii kale, dhinaca dirista waxay ku soo celisaa xogta lakabka sare, tani waa calaamad muujinaysa in daaqadu buuxsanto. Caadi ahaan lakabka sare wuxuu isku dayi doonaa inuu gudbiyo xogta mar kale muddo ka dib. Codsiga dhabta ah, soo diruhu waxay u badan tahay inuu kaydiyo xogta (halkii uu isla markiiba u diri lahaa) ama wuxuu lahaan doonaa habka isku-dhafka (sida semaphore ama calan) kaas oo u oggolaanaya lakabka sare inuu waco shaqada diritaanka kaliya marka daaqadu faaruqsan tahay .
- helitaanka xaqiijin Hab-maamuuska, baakidh leh nambarka isku xigxiga N, waxa la soo saaray qirasho guud oo muujinaysa in dhammaan baakadaha wata lambarrada taxanaha ah ee ka horreeya N si guul leh loo helay.
- Muddadii sugitaanka way dhacday. Si loo go'aamiyo xaqiiqooyinka khasaaraha iyo dib u dhaca baakadaha iyo rasiidhada, hab-maamuuska waxa uu isticmaalayaa saacad. Haddii muddada wakhtigu dhammaatay, dhinaca soo diraya waxay soo dirtaa dhammaan baakadaha aan la aqoonsan ee la soo diray.
Ku celcelin xul ah
Marka cabbirka daaqada iyo badeecada dib u dhigista faafinta ay weyn yihiin, tiro badan oo baakado ah ayaa laga yaabaa inay ku jiraan dhuumaha. Xaaladdan oo kale, hal cilad baakidh ah ayaa laga yaabaa inay keento tiro badan oo baakidhooyin ah in dib loo gudbiyo, kuwaas oo intooda badan aan loo baahnayn.
Tusaale:
Ugu fiican
Server
package main
import (
"bufio"
"fmt"
"log"
"net"
"strings"
)
func main() {
// создаем сокет с портом
ln, err := net.Listen("tcp", ":8081")
if err != nil {
log.Fatalln(err)
}
// ожидание вызова
conn, _ := ln.Accept()
for {
// считывание данных
msg, err := bufio.NewReader(conn).ReadString('n')
if err != nil {
log.Fatalln(err)
}
// вывод сообщения в stdout
fmt.Print("Message Received:", string(msg))
// перевод строки в верхний регистр
newMsg := strings.ToUpper(msg)
// отправка данных
conn.Write([]byte(newMsg + "n"))
}
}
Macaamiil
package main
import (
"bufio"
"fmt"
"log"
"net"
"os"
)
func main() {
// установка соединения
conn, err := net.Dial("tcp", "127.0.0.1:8081")
if err != nil {
log.Fatalln(err)
}
for {
// считывание данных с stdin
reader := bufio.NewReader(os.Stdin)
fmt.Print("Text to send: ")
// построчно
text, err := reader.ReadString('n')
if err != nil {
log.Fatalln(err)
}
// отправка
fmt.Fprintf(conn, text+"n")
// прием
msg, err := bufio.NewReader(conn).ReadString('n')
if err != nil {
log.Fatalln(err)
}
// вывод полученного ответа
fmt.Print("Msg from Server: " + msg)
}
}
gunaanad
Farsamooyin lagu hubinayo wareejinta iyo isticmaalka xogta la isku halayn karo
Mechanism
Codsi, faallo
Hubi wadarta
Loo isticmaalo in lagu ogaado khaladaadka yar ee xirmada la kala qaado
Saacadda
Waxay tiriyaa muddada u dhexaysa waxayna muujisaa marka uu dhacay Midda dambe waxay la macno tahay in iyada oo ay jirto ixtimaalka sare ee baakadda ama rasiidhkeeda ay lunto inta lagu jiro gudbinta. Haddii baakidh la keeno daahitaan, laakiin aan la lumin (ku dhicis degdeg ah ee muddada u dhaxaysa), ama rasiidka lumo, dib u gudbintu waxay keentaa baakidh nuqul ah oo dhinaca hesha ah.
Nambarada taxan
Waxaa loo istcimaalay tirinta isku xigxiga ee xirmooyinka xogta laga soo diro soo diraha loo gudbiyo qaataha. Nusqaamaha tirooyinka isku xigxiga ee xirmooyinka la helay ayaa u oggolaanaya qaataha inuu ogaado khasaaraha xirmada. Isla lambarada isku xigxiga ee baakidhku waxay ka dhigan yihiin in baakooyinka midba midka kale nuqul ka yahay
Xaqiijinta
Waxaa keenay dhamaadka helista oo tusinaya dhamaadka dirida in xirmada ama kooxda xidhmooyinka u dhiganta si guul leh loo helay. Caadi ahaan qirashadu waxa ay ka kooban tahay tirooyinka isku xigxiga ee xidhmooyinka si guul leh loo helay. Iyadoo ku xiran hab-maamuuska, xaqiijinta shaqsi iyo koox ayaa la kala saaraa
Xaqiijinta taban
Wuxuu isticmaalay qaataha si uu ugu wargaliyo soo diraha in baakadda si khaldan loo helay. Ictiraafka taban waxaa badanaa ka mid ah lambarka isku xigxiga ee xirmada oo aan si sax ah loo helin
Daaqadda, gudbinta
Yaree tirada tirooyinka isku xigxiga ee loo isticmaali karo gudbinta xirmooyinka. Multicast iyo gacan-qaadka ayaa si weyn u kordhin kara soosaarka borotokoolka marka loo eego sugitaanka qirashada. Sida aan arki doonno, cabbirka daaqada waxaa lagu xisaabin karaa iyadoo lagu saleynayo soo dhaweynta iyo awoodaha soo dhaweynta ee dhamaadka helitaanka, iyo sidoo kale heerka culeyska shabakada
Tusaalayaal badan oo isticmaalka Go ee isku xidhka
В
Source: www.habr.com