web-dev-qa-db-ja.com

バインドされたリスニングソケットの読み取りや書き込みを行うことは理にかなっていますか?

私は、PHPでソケットサーバーの作成を少し実験しています。そうすることで、私が必要としていると思われる種類のソケットを抽象化しようとしています。

  • ListenSocket —アド​​レス/ポートにバインドされ、着信接続をリッスンして受け入れる「マスター」ソケット。
  • CommunicationSocket —サーバーが通信する、受け入れられた着信接続を表す「子」ソケット。

名前がすでに示唆しているように、CommunicationSocketでは、read()およびwrite()タイプのメソッドのみを定義します。

しかし、そうすることで私は疑問に思いました:最初のタイプのソケット(バインドされたリスニングタイプ)から読み書きすることは理にかなっていますか?

7
Decent Dabbler

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
2
User