본문 바로가기
파이썬

파이썬 Python UDP 클라이언트 / 서버 프로그램, 문제

by º기록 2020. 9. 17.
반응형

기본 클라이언트 / 서버 에코 프로그램을 작성하여 select ()를 기반으로 재전송을위한 타이머 사용을 테스트하려고합니다 (의도 한대로 작동하지 않을 때 디버깅을 단순화하기 위해 해당 비트를 주석 처리해야했지만). 다음은 관련 코드의 일부입니다.

섬기는 사람:

from socket import *
import sys
import select
address = ('localhost', 6005)
server_socket = socket(AF_INET, SOCK_DGRAM)
server_socket.bind(address)

while(1):
    print "Listening"
    recv_data, addr = server_socket.recvfrom(2048)
    print recv_data
    if recv_data == "Request 1" :
        print "Received request 1"
        server_socket.sendto("Response 1", address)
    elif recv_data == "Request 2" :
        print "Received request 2"
        data = "Response 2"
        server_socket.sendto(data, address)

고객:

from socket import *
import sys
import select

address = ('localhost', 6005)
client_socket = socket(AF_INET, SOCK_DGRAM)

num_retransmits = 0
while(num_retransmits < 60):
    num_retransmits = num_retransmits + 1


    data = "Request 1"
    client_socket.sendto(data, address)
    print "Sending request 1"

    recv_data, addr = client_socket.recvfrom(2048)

    print recv_data, "!!"

클라이언트의 출력은 단순히 'Sending request 1'이며, recvfrom 호출 또는 그 아래에 중단 점이 사용되면 중단 점에 도달하지 않습니다. 그래서 나는 클라이언트가 아무것도받지 못하고 있고받을 때까지 버티고 있다고 생각합니다. 반면에 서버의 출력은 다음과 같습니다.

등등 등등

첫 번째 루프 후 서버는 다시 루프를 실행하고 RESPONSE 1을 인쇄합니다. 이는 서버가 요청 1을 수신하고 클라이언트에 응답 1을 보내고 루프를 보내는 것이 었음을 의미합니다. 소켓에! 그렇기 때문에 recv_data를 인쇄 할 때 응답 1을 인쇄합니다. 반면에 클라이언트는 recv_data를 인쇄하지 않습니다. 클라이언트가 수신하지 않았기 때문에 클라이언트는 여전히 서버 소켓의 버퍼에 있습니다.

제발 도와주세요-다른 에코 프로그램을 살펴 보았지만 모두 TCP를 사용하는 것 같고 상당히 간단합니다 (나는 거의 같은 단계를 따랐다 고 생각합니다). 내 UDP 프로그램이 작동하지 않는 이유를 모르겠습니다. sendall () 호출을 살펴 보았지만 TCP에서만 작동하는 것 같습니다.

 

해결 방법

 

주소 대신 addr로 보내야합니다.

from socket import *
import sys
import select
address = ('localhost', 6005)
server_socket = socket(AF_INET, SOCK_DGRAM)
server_socket.bind(address)

while(1):
    print "Listening"
    recv_data, addr = server_socket.recvfrom(2048)
    print recv_data
    if recv_data == "Request 1" :
        print "Received request 1"
        server_socket.sendto("Response 1", addr)
    elif recv_data == "Request 2" :
        print "Received request 2"
        data = "Response 2"
        server_socket.sendto(data, addr)

 

참조 페이지 https://stackoverflow.com/questions/9862762

 

 

반응형

댓글