Ha sempre senso leggere e / o scrivere su una presa collegata, in ascolto?

7

Sto sperimentando un po 'con la creazione di un server socket, in PHP. In tal modo sto cercando di astrarre il tipo di socket che penso avrò bisogno, che ho chiamato con un nome:

  • ListenSocket - il socket "master", che è associato a un indirizzo / porta e ascolta e accetta le connessioni in entrata.
  • CommunicationSocket - un socket "figlio", che rappresenta una connessione in ingresso accettata, con cui il server comunicherà.

Come suggerisce già il nome, definirò solo read() e write() tipi di metodi su CommunicationSocket .

Tuttavia, così facendo mi sono chiesto: ha mai senso leggere o scrivere sul primo tipo di socket (il tipo bounded, listening)?

    
posta Decent Dabbler 25.06.2015 - 11:19
fonte

1 risposta

2

Interpreto la tua domanda in modo da farti riferimento ai socket TCP / IP. Con i socket UDP / IP è diverso.

Due scenari:

Scenario 1: 1. bind 2. connessione 3. ascolta
Risultato: non è possibile ascoltare su un socket collegato.

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

Scenario 2: 1. bind 2. listen 3. connect
Risultato: non è possibile connettersi o inviare in una presa di ascolto.

>>> 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
    
risposta data 02.07.2015 - 09:44
fonte

Leggi altre domande sui tag