2017-10-13 9 views
0

Code Serveur:prises Python - client ne reçoit pas datagrammes UDP

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # server UDP socket 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # bypass OS lock on port 
s.bind((socket.gethostname(), 9999)) # bind socket to host and port 9999 
while True: 
    message, ip = s.recvfrom(1024) # receive data passed through socket 
    print "Server:\n\tMessage \"{}\" received...\n\tIt has a length of {}".format(
      message, len(message)) 
    s.sendto(str(len(message)), (socket.gethostname(), 9999)) # send message length in bytes back to client 
    s.close() # close UDP connection with client 
    sys.exit(0) # terminate server process 

Code client:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.connect((socket.gethostname(), 9999)) 
message = "Pointless text." 
print "Client:\n\tSending message \"{}\" to the server...\n\tIt has a length of {}".format(
     message, len(message)) 
s.sendto(message, (socket.gethostname(), 9999)) 
while True: 
    response, ip = s.recvfrom(1024) 
    if int(response) == len(message): 
     print "Client:\n\tThe server returned count {} which is equal to the client's count of {}.".format(response, len(message)) 
    else: 
     print "Client:\n\tThe server returned count {} which is not equal to the client's count of {}.".format(response, len(message)) 
s.close() 

Sortie:

Running client in UDP mode... 
Running server in UDP mode... 

Client: 
    Sending message "Pointless text." to the server... 
    It has a length of 15 
Server: 
    Message "Pointless text." received... 
    It has a length of 15 

Le côté client recvfrom ne se déclenche jamais et je ne peux pas comprendre pourquoi.

Voici les client et server complets fichiers si vous voulez les tester directement sur votre machine comme ceci:

python2.7 server udp & python2.7 client udp 

Répondre

2

Dans votre code serveur, vous envoyez le résultat à l'adresse du serveur (9999), pas du client (ip).

Essayez ceci:

s.sendto(str(len(message)), ip) # send message length in bytes back to client 
+0

Merci monsieur. J'ai supposé que le code client 's.connect ((socket.gethostname(), 9999))' configurerait le socket client à recevoir sur le port 9999 et le code client 's.sendto (message, (socket.gethostname(), 9999)) 'configurerait le socket pour envoyer au port 9999 ... pouvez-vous expliquer pourquoi l'adresse dans' connect() 'est nécessaire si elle ne configure pas le port de réception et le' sendto() 'gère le port de destination? – aweeeezy

+0

En fait, je viens de répondre à ma propre question - supprimer la ligne 'connect()' n'affecte pas mon programme. – aweeeezy