github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/udpsock.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package net 6 7 import ( 8 "github.com/shogo82148/std/net/netip" 9 "github.com/shogo82148/std/syscall" 10 ) 11 12 // UDPAddrはUDPエンドポイントのアドレスを表します。 13 type UDPAddr struct { 14 IP IP 15 Port int 16 Zone string 17 } 18 19 // AddrPortはUDPAddr aをnetip.AddrPortとして返します。 20 // 21 // もしa.Portがuint16に収まらない場合、静かに切り捨てられます。 22 // 23 // もしaがnilの場合、ゼロ値が返されます。 24 func (a *UDPAddr) AddrPort() netip.AddrPort 25 26 // Networkはアドレスのネットワーク名、"udp"を返します。 27 func (a *UDPAddr) Network() string 28 29 func (a *UDPAddr) String() string 30 31 // ResolveUDPAddr はUDPのエンドポイントのアドレスを返します。 32 // 33 // ネットワークはUDPのネットワーク名である必要があります。 34 // 35 // アドレスパラメータのホストがIPアドレスのリテラルでない場合、または 36 // ポート番号がリテラルのポート番号でない場合、ResolveUDPAddrは 37 // UDPエンドポイントのアドレスに解決します。 38 // それ以外の場合は、アドレスをリテラルのIPアドレスとポート番号のペアとして解析します。 39 // アドレスパラメータはホスト名を使用することもできますが、これは 40 // 推奨されません。なぜなら、ホスト名のIPアドレスのいずれか一つしか返さないからです。 41 // 42 // ネットワークおよびアドレスパラメータの説明については、func Dialを参照してください。 43 func ResolveUDPAddr(network, address string) (*UDPAddr, error) 44 45 // UDPAddrFromAddrPortはaddrをUDPAddrとして返します。もしaddr.IsValid()がfalseであれば、返されるUDPAddrにはnilのIPフィールドが含まれ、アドレスファミリーに依存しない未指定のアドレスを示します。 46 func UDPAddrFromAddrPort(addr netip.AddrPort) *UDPAddr 47 48 // UDPConnはUDPネットワーク接続のConnおよびPacketConnインターフェースの実装です。 49 type UDPConn struct { 50 conn 51 } 52 53 // SyscallConnは生のネットワーク接続を返します。 54 // これはsyscall.Connインターフェースを実装しています。 55 func (c *UDPConn) SyscallConn() (syscall.RawConn, error) 56 57 // ReadFromUDPはReadFromと同様の動作をしますが、UDPAddrを返します。 58 func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err error) 59 60 // ReadFrom は PacketConn の ReadFrom メソッドを実装します。 61 func (c *UDPConn) ReadFrom(b []byte) (int, Addr, error) 62 63 // ReadFromUDPAddrPortはReadFromと同様の機能を提供しますが、netip.AddrPortを返します。 64 // 65 // cが指定されていないアドレスにバインドされている場合、返される 66 // netip.AddrPortのアドレスは、IPv4-mapped IPv6アドレスの可能性があります。 67 // IPv6のプレフィックスなしのアドレスを取得するには、netip.Addr.Unmapを使用してください。 68 func (c *UDPConn) ReadFromUDPAddrPort(b []byte) (n int, addr netip.AddrPort, err error) 69 70 // ReadMsgUDPは、cからメッセージを読み込み、ペイロードをbにコピーし、サイドバンドデータをoobにコピーします。bにコピーされたバイト数、oobにコピーされたバイト数、メッセージに設定されたフラグ、およびメッセージのソースアドレスを返します。 71 // 72 // パッケージgolang.org/x/net/ipv4およびgolang.org/x/net/ipv6は、oob内のIPレベルのソケットオプションを操作するために使用できます。 73 func (c *UDPConn) ReadMsgUDP(b, oob []byte) (n, oobn, flags int, addr *UDPAddr, err error) 74 75 // ReadMsgUDPAddrPortは、UDPAddrではなくnetip.AddrPortを返すReadMsgUDPと同様の機能です。 76 func (c *UDPConn) ReadMsgUDPAddrPort(b, oob []byte) (n, oobn, flags int, addr netip.AddrPort, err error) 77 78 // WriteToUDPはWriteToと同様の動作をしますが、UDPAddrを引数に取ります。 79 func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error) 80 81 // WriteToUDPAddrPortは、WriteToと同様に動作しますが、netip.AddrPortを受け取ります。 82 func (c *UDPConn) WriteToUDPAddrPort(b []byte, addr netip.AddrPort) (int, error) 83 84 // WriteToはPacketConnのWriteToメソッドを実装します。 85 func (c *UDPConn) WriteTo(b []byte, addr Addr) (int, error) 86 87 // WriteMsgUDPは、cが接続されていない場合はcを介してaddrにメッセージを書き込み、 88 // cが接続されている場合はcのリモートアドレスにメッセージを書き込みます(その場合、 89 // addrはnilでなければなりません)。ペイロードはbからコピーされ、関連する 90 // フラグデータはoobからコピーされます。ペイロードとフラグデータの書き込まれた 91 // バイト数を返します。 92 // 93 // パッケージgolang.org/x/net/ipv4およびgolang.org/x/net/ipv6を使用して、 94 // oob内のIPレベルのソケットオプションを操作することができます。 95 func (c *UDPConn) WriteMsgUDP(b, oob []byte, addr *UDPAddr) (n, oobn int, err error) 96 97 // WriteMsgUDPAddrPortはUDPAddrではなく、netip.AddrPortを受け取るWriteMsgUDPと同様のものです。 98 func (c *UDPConn) WriteMsgUDPAddrPort(b, oob []byte, addr netip.AddrPort) (n, oobn int, err error) 99 100 // DialUDPはUDPネットワークのためにDialと同様の機能を提供します。 101 // 102 // ネットワークはUDPネットワークの名前でなければならず、詳細についてはfunc Dialを参照してください。 103 // 104 // もしladdrがnilの場合、自動的にローカルアドレスが選択されます。 105 // もしraddrのIPフィールドがnilまたは未指定のIPアドレスの場合、ローカルシステムが仮定されます。 106 func DialUDP(network string, laddr, raddr *UDPAddr) (*UDPConn, error) 107 108 // ListenUDPは、UDPネットワークに対してListenPacketと同様の機能を提供します。 109 // 110 // ネットワークはUDPネットワーク名でなければなりません。詳細については、func Dialを参照してください。 111 // 112 // laddrのIPフィールドがnilまたは未指定のIPアドレスである場合、 113 // ListenUDPは、マルチキャストIPアドレスを除く、ローカルシステムのすべての利用可能なIPアドレスでリスンします。 114 // laddrのPortフィールドが0の場合、ポート番号が自動的に選択されます。 115 func ListenUDP(network string, laddr *UDPAddr) (*UDPConn, error) 116 117 // ListenMulticastUDPは、グループアドレスを指定したネットワークインターフェース上でのUDPネットワーク用のListenPacketのように動作します。 118 // ネットワークはUDPネットワーク名である必要があります。詳細については、func Dialを参照してください。 119 // ListenMulticastUDPは、グループのマルチキャストIPアドレスを含む、ローカルシステムの利用可能なすべてのIPアドレスでリッスンします。 120 // ifiがnilの場合、ListenMulticastUDPはシステムが割り当てたマルチキャストインターフェースを使用しますが、これは推奨されません。割り当てはプラットフォームに依存し、時にはルーティングの設定が必要になる場合があります。 121 // gaddrのPortフィールドが0の場合、ポート番号が自動的に選択されます。 122 // ListenMulticastUDPは、単純で小規模なアプリケーションのための便利さのために提供されています。一般的な目的にはgolang.org/x/net/ipv4とgolang.org/x/net/ipv6パッケージがあります。 123 // ListenMulticastUDPは、IPPROTO_IPのIP_MULTICAST_LOOPソケットオプションを0に設定して、マルチキャストパケットのループバックを無効にします。 124 func ListenMulticastUDP(network string, ifi *Interface, gaddr *UDPAddr) (*UDPConn, error)