私は、PHPでソケットサーバーの作成を少し実験しています。そうすることで、私が必要としていると思われる種類のソケットを抽象化しようとしています。
ListenSocket
—アドレス/ポートにバインドされ、着信接続をリッスンして受け入れる「マスター」ソケット。CommunicationSocket
—サーバーが通信する、受け入れられた着信接続を表す「子」ソケット。名前がすでに示唆しているように、CommunicationSocket
では、read()
およびwrite()
タイプのメソッドのみを定義します。
しかし、そうすることで私は疑問に思いました:最初のタイプのソケット(バインドされたリスニングタイプ)から読み書きすることは理にかなっていますか?
TCP/IPソケットを参照する方法であなたの質問を解釈します。 UDP/IPソケットでは異なります。
2つのシナリオ:
シナリオ1:1.バインド2.接続3.待機
結果:接続されたソケットでリッスンできません。
>>> import socket
>>> s = socket.socket()
>>> s.bind(('', 0))
>>> s.send(b'a')
Traceback (most recent call last):
File "<pyshell#130>", line 1, in <module>
s.send(b'a')
OSError: [WinError 10057] A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied
>>> s.connect(('google.de', 80))
>>> s.listen(1)
Traceback (most recent call last):
File "<pyshell#132>", line 1, in <module>
s.listen(1)
OSError: [WinError 10056] A connect request was made on an already connected socket
シナリオ2:1.バインド2.リッスン3.接続
結果:リスニングソケットで接続または送信できません。
>>> s = socket.socket()
>>> s.bind(('', 0))
>>> s.listen(1)
>>> s.connect(('google.de', 80))
Traceback (most recent call last):
File "<pyshell#136>", line 1, in <module>
s.connect(('google.de', 80))
OSError: [WinError 10022] An invalid argument was supplied
>>> s.send(b"123")
Traceback (most recent call last):
File "<pyshell#137>", line 1, in <module>
s.send(b"123")
OSError: [WinError 10057] A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied