[インデックス 12262] ファイルの概要
このドキュメントは、Go言語のnet
パッケージにおけるコミット e266d6064c7e485673ea651d673b2ca22e0649f2
についての詳細な技術解説を提供します。このコミットは、Dial
関数とunixgram
ネットワークの使用に関するコメントの修正を目的としています。
コミット
commit e266d6064c7e485673ea651d673b2ca22e0649f2
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date: Wed Feb 29 07:45:38 2012 +0900
net: fix comment on Dial with unixgram
We should use DialUnix or ListenPacket for unixgram networks
because Dial doesn't take a local UnixAddr.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5706043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/e266d6064c7e485673ea651d673b2ca22e0649f2
元コミット内容
net: fix comment on Dial with unixgram
We should use DialUnix or ListenPacket for unixgram networks because Dial doesn't take a local UnixAddr.
変更の背景
このコミットは、Go言語の標準ライブラリであるnet
パッケージ内のdial.go
ファイルにおけるコメントの誤りを修正することを目的としています。具体的には、Dial
関数がサポートするネットワークタイプの説明において、unixgram
ネットワークに関する記述が不正確であったため、その点を修正しています。
Dial
関数は、指定されたネットワークアドレスへの接続を確立するための汎用的なインターフェースを提供しますが、unixgram
ネットワーク(Unixドメインデータグラムソケット)の場合、Dial
関数はローカルのUnixAddr
(Unixドメインソケットのアドレス)を受け取ることができません。そのため、unixgram
ネットワークを使用する際には、より特化した関数であるDialUnix
またはListenPacket
を使用することが推奨されます。このコミットは、この重要な使用上の注意点をコメントに明記することで、開発者が正しいAPIを選択できるようにガイドすることを意図しています。
前提知識の解説
Go言語のnet
パッケージ
Go言語のnet
パッケージは、ネットワークI/Oのポータブルなインターフェースを提供します。TCP/IP、UDP、Unixドメインソケットなど、様々なネットワークプロトコルを扱うための機能が含まれています。
net.Dial
関数
net.Dial
は、Go言語でネットワーク接続を確立するための最も一般的な関数の一つです。以下のようなシグネチャを持ちます。
func Dial(network, address string) (Conn, error)
network
: 接続するネットワークの種類を指定します(例: "tcp", "udp", "unix")。address
: 接続先のアドレスを指定します(例: "localhost:8080", "/tmp/sock")。
この関数は、指定されたネットワークとアドレスに基づいて、適切なnet.Conn
インターフェースを返します。
Unixドメインソケット
Unixドメインソケットは、同じホスト上のプロセス間通信(IPC)に使用されるソケットの一種です。ネットワークスタックを介さずに直接カーネルを介して通信するため、TCP/IPソケットよりも高速で効率的です。Unixドメインソケットには以下の種類があります。
- ストリームソケット (
unix
): TCPと同様に、信頼性のある接続指向のバイトストリームを提供します。 - データグラムソケット (
unixgram
): UDPと同様に、非接続指向のデータグラム通信を提供します。メッセージの境界が保持されますが、信頼性や順序は保証されません。 - シーケンスパケットソケット (
unixpacket
): ストリームソケットとデータグラムソケットの中間的な性質を持ち、信頼性のある接続指向のデータグラム通信を提供します。
net.UnixAddr
net.UnixAddr
は、Unixドメインソケットのアドレスを表す構造体です。通常、ファイルシステム上のパス(例: /tmp/my.sock
)として表現されます。
type UnixAddr struct {
Name string // Unix socket path
Net string // "unix", "unixgram", or "unixpacket"
}
net.DialUnix
関数
net.DialUnix
は、Unixドメインソケットに特化した接続関数です。
func DialUnix(network string, laddr, raddr *UnixAddr) (*UnixConn, error)
network
: "unix", "unixgram", "unixpacket" のいずれかを指定します。laddr
: オプションでローカルのUnixAddr
を指定します。nil
の場合、システムが自動的に選択します。raddr
: 接続先のリモートUnixAddr
を指定します。
この関数は、Dial
とは異なり、ローカルアドレスを明示的に指定できる点が特徴です。
net.ListenPacket
関数
net.ListenPacket
は、パケット指向のネットワーク接続をリッスンするための関数です。
func ListenPacket(network, address string) (PacketConn, error)
network
: "udp", "udp4", "udp6", "unixgram" などを指定します。address
: ローカルのネットワークアドレスを指定します。
この関数は、データグラムソケット(例: UDPやUnixデータグラム)からのパケットを受信するために使用されます。
技術的詳細
net.Dial
関数は、内部的にresolveNetAddr
関数を呼び出してネットワークアドレスを解決します。しかし、unixgram
ネットワークの場合、Dial
の設計上、ローカルのUnixAddr
を引数として受け取ることができません。これは、Dial
が主にリモートアドレスへの接続を目的としているためです。
unixgram
ソケットはデータグラム指向であり、送信元アドレスが重要になる場合があります。Dial
関数でunixgram
を使用しようとすると、ローカルアドレスが適切に設定されないため、意図しない動作やエラーが発生する可能性があります。
このため、unixgram
ネットワークでクライアントとして接続する場合や、特定のローカルアドレスからパケットを送信したい場合には、net.DialUnix
を使用し、laddr
引数にローカルのUnixAddr
を指定することが適切です。また、unixgram
ソケットでパケットを受信し、サーバーとして機能する場合には、net.ListenPacket
を使用するのが正しいアプローチです。
このコミットは、dial.go
内のコメントが、Dial
関数がunixgram
ネットワークもサポートしているかのように誤解を招く可能性があったため、その記述を修正し、より正確な情報を提供することで、開発者が適切なAPIを選択できるように促しています。
コアとなるコードの変更箇所
変更はsrc/pkg/net/dial.go
ファイル内の1行のみです。
--- a/src/pkg/net/dial.go
+++ b/src/pkg/net/dial.go
@@ -69,7 +69,7 @@ func resolveNetAddr(op, net, addr string) (afnet string, a Addr, err error) {
//
// Known networks are "tcp", "tcp4" (IPv4-only), "tcp6" (IPv6-only),
// "udp", "udp4" (IPv4-only), "udp6" (IPv6-only), "ip", "ip4"
-// (IPv4-only), "ip6" (IPv6-only), "unix", "unixgram" and "unixpacket".
+// (IPv4-only), "ip6" (IPv6-only), "unix" and "unixpacket".
//
// For TCP and UDP networks, addresses have the form host:port.
// If host is a literal IPv6 address, it must be enclosed
具体的には、69行目のコメントから "unixgram"
という文字列が削除されています。
コアとなるコードの解説
変更された行は、Dial
関数がサポートする「既知のネットワーク」を列挙しているコメントの一部です。
変更前:
// (IPv4-only), "ip6" (IPv6-only), "unix", "unixgram" and "unixpacket".
変更後:
// (IPv4-only), "ip6" (IPv6-only), "unix" and "unixpacket".
この修正により、Dial
関数がunixgram
ネットワークに対して直接的に推奨されるAPIではないという事実が、コメントによって明確に示されるようになりました。これは、Dial
がローカルのUnixAddr
を受け取らないという技術的な制約を反映したものです。開発者はこのコメントを見ることで、unixgram
ネットワークを扱う際にはDialUnix
やListenPacket
といったより適切な関数を使用すべきであると理解できます。
関連リンク
- Go言語の
net
パッケージドキュメント: https://pkg.go.dev/net - Go言語の
net.Dial
関数ドキュメント: https://pkg.go.dev/net#Dial - Go言語の
net.DialUnix
関数ドキュメント: https://pkg.go.dev/net#DialUnix - Go言語の
net.ListenPacket
関数ドキュメント: https://pkg.go.dev/net#ListenPacket
参考にした情報源リンク
- Go CL 5706043: https://go-review.googlesource.com/c/go/+/5706043
- Web検索結果: "Go net package Dial unixgram", "Go DialUnix ListenPacket"