Go의 장난감 UDP 서버 및 클라이언트. 나는 Go의 표준 패키지 net
, 특히 UDP 관련 기능을 익히기 위해 이 작업을 수행했습니다.
내가 글을 쓰면서 배웠기 때문에, 여기 server.go가 UDP 소켓을 수행하는 방식과 client.go가 일부 "일반" 소켓 작업을 수행하는 방식 사이에 이상한 문체 불일치가 있습니다. 이 불일치를 조정하기 위해 나는 server.go와 일치하도록 UDP 함수만으로 client2.go를 수행했습니다.
또한 Python 3 클라이언트도 추가했는데, 다른 곳에 둘 곳이 없었기 때문입니다.
서버는 특정 포트 번호에서 UDP 패킷을 수신합니다. net.ReadFromUDP()
메소드 호출을 차단합니다.
서버가 바이트를 받으면 어디서 받은 바이트 수를 출력한 다음 동일한 바이트 수를 받은 위치에 다시 씁니다.
클라이언트는 명령줄 정보를 기반으로 일부 IP(v4 또는 v6) 또는 호스트 이름과 포트 번호에 대한 UDP 연결을 생성합니다. 그런 다음 역시 명령줄의 문자열 바이트를 UDP 연결에 씁니다. 일부 바이트가 다시 돌아올 때까지 기다립니다. 그렇지 않으면 오류가 발생합니다. 그러면 존재합니다.
단순하면서도 문제가 가득합니다. 시간 초과가 없고 바이트 수가 설정되지 않았습니다. 클라이언트나 서버는 도착하지 않는 패킷을 기다리며 영원히 멈출 수 있습니다.
$ go build server.go
$ go build client.go
$ go build client2.go
Python 3 클라이언트는 해석되며 "빌딩"이 필요하지 않습니다.
창 1에서:
$ ./server :: 7890
Accepting a new packet
창 2에서:
$ ./client udp localhost 7890 'some string'
또는:
$ ./client2 fe80::a11:96ff:fe7f:6d74 7890 'some string' [eth0]
또는:
$ ./client1.py localhost 7890 'some string'
./client2
의 마지막 인수는 선택 사항입니다. 패킷을 라우팅하는 네트워크 인터페이스의 이름입니다. net.UDPAddr
의 내용을 참고하세요.
type UDPAddr struct {
IP IP
Port int
Zone string // IPv6 scoped addressing zone
}
Zone 요소는 링크-로컬 주소(fe80: 접두사) 라우팅에 사용됩니다. 인터페이스 이름은 영역으로 작동합니다. 네 번째 인수로 호출되면 client2
해당 인수를 "영역"으로 사용합니다.