
рдЬреЛ рд▓реЛрдЧ рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рд╕рдорд░реНрдкрд┐рдд рд╣реИрдВред
рд╕рдВрдХреНрд╖рд┐рдкреНрдд, Go, UDP TCP. , , " . ", .
рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рд▓реЗрдпрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓
рд╡рд┐рднрд┐рдиреНрди рдореЗрдЬрдмрд╛рдиреЛрдВ рдкрд░ рдЪрд▓ рд░рд╣реА рдЖрд╡реЗрджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдмрдВрдз рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдХрдиреЗрдХреНрд╢рди рдПрдХ рдЪреИрдирд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

, ( тАФ DPI). , , , .

( ) .

, () . . , -.

. , .
package main
import (
"log"
"net"
)
func main() {
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)
println(string(buf[0:n]), " form ", addr.IP.String())
if err != nil {
log.Fatal(err)
}
}
}
package main
import (
"fmt"
"log"
"net"
"time"
)
func main() {
serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
if err != nil {
log.Fatal(err)
}
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)
}
time.Sleep(time.Second * 1)
}
}
тАФ , , , , , .

:
, , (Automatic Repeat reQuest, ARQ).
, , .
, TCP, , .

,
, , .
:
, , , , . : . , . net TCPKeepAlive 15 :
const (
defaultTCPKeepAlive = 15 * time.Second
)
( , ), .
, :
!
, , . ┬л┬╗ , , RTT. , .

:
, , . :
N тАФ

:
- . ┬л┬╗ , ( N , ). , , . , , . . , , ( ), (, ), .
- . N , , , N, .
- . . , .
, . , .
TCP. - , тАФ welcome.
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)
}
fmt.Print("Message Received:", string(msg))
newMsg := strings.ToUpper(msg)
conn.Write([]byte(newMsg + "\n"))
}
}
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 {
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)
}
}
,
рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг
рдореЗрдВ рднрдВрдбрд╛рд░ ред