2017-10-25 1 views
0

http://www.binarytides.com/programming-udp-sockets-in-python/의 예제를 기반으로 파이썬 3에서 실행되도록 수정하고 클라이언트와 서버에서 두 개의 반대 포트를 사용하므로 각각의 응답이이 포트로 이동합니다. 여기 내 예다른 일치하는 들어오는 나가는 포트가있는 파이썬 UDP 클라이언트 - 서버

서버 :

''' 
    Simple udp socket server 
''' 

import socket 
import sys 

HOST = 'localhost' 
PORT_IN = 8889 # Arbitrary non-privileged port 
PORT_OUT = 8888 

# Datagram (udp) socket 
try : 
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    print('Socket created') 
except socket.error as e: 
    print(e) 
    sys.exit() 


# Bind socket to local host and port 
try: 
    s.bind((HOST, PORT_IN)) 
except socket.error as e: 
    print(e) 
    sys.exit() 

print('Socket bind complete') 

#now keep talking with the client 
while 1: 
    # receive data from client (data, addr) 
    d = s.recvfrom(1024) 
    data = d[0] 
    addr = d[1] 

    if not data: 
     break 

    reply = 'OK...' + str(data) 

    s.sendto(reply.encode('UTF-8'), ('localhost', PORT_OUT)) 
    print('Message[' + addr[0] + ':' + str(addr[1]) + '] - ' + str(data).strip()) 

s.close() 

클라이언트 :

''' 
    udp socket client 
    Silver Moon 
''' 

import socket #for sockets 
import sys #for exit 

# create dgram udp socket 
try: 
    s1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    s2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
except socket.error: 
    print('Failed to create socket') 
    sys.exit() 

host = 'localhost' 
port_out = 8889 
port_in = 8888 

counter = 0 
while(1) : 
    # msg = b'aoua' 
    msg = 'aoua' + str(counter) 

    try : 
     #Set the whole string 
     s1.sendto(msg.encode('UTF-8'), (host, port_out)) 

     # receive data from client (data, addr) 
     s2.bind(('localhost', port_in)) 
     d = s2.recvfrom(1472) 
     reply = d[0] 
     addr = d[1] 

     print('Server reply : ' + str(reply)) 

    except socket.error as e: 
     print(e) 
     # sys.exit() 
    counter += 1 

문제는 모든 서버에서 응답 및 오류 [WinError 10022] An invalid argument was suppliedd = s2.recvfrom(1472) 중지를받을 수없는 클라이언트입니다. sock.settimeout(seconds)과 약간 다른 동작을 발견했지만 실제로 그 이유를 알 수는 없습니다. d = s2.recvfrom(buffer)은 들어오는 데이터를 기다리지 않아야합니까? 여기에 무엇이 누락 되었습니까?

답변

0

젠장 ... 그냥 보았습니다. 어리석은 실수. 루프 내부의 클라이언트에서 s2.bind(('localhost', port_in))을 호출합니다.