첫째, 나는 소켓 프로그래밍의 완전한 멍청이이기 때문에 내가 뭔가 잘못하고 있다는 것을 알려주십시오.
그래서 저는 간단한 fps 게임을 위해 udp 서버를 프로그래밍하려고했습니다.
로컬 네트워크에서는 모든 것이 잘 작동하지만 인터넷에서 코드를 사용하려고하면 몇 가지 문제가 발생합니다. 내 서버는 클라이언트 화이트 아웃 문제로부터 데이터를 수신 할 수 있으며 클라이언트에서 전송중인 포트가 열려 있으면 클라이언트에 데이터를 보낼 수 있으며 그렇지 않은 경우 클라이언트는 데이터를 수신하지 않습니다. (서버의 포트가 모두 열려 있습니다). 내 질문은 이제 포트를 열거 나 전달할 필요없이 인터넷을 통해 데이터를 수신 할 수있는 방법이 있습니까?
(client () 함수는 루프에서 지속적으로 반복됩니다)
데이터 수신을위한 내 코드는 다음과 같습니다.
import socket
server_IP = 'ip of server'
Client_port = 3560
Server_port = 5000
Client_socket = None
First_run = True
first = True
def client():
global server_IP
global Client_port
global Server_port
global Client_socket
global first
if first == True:
try:
local = ('', Client_port)
host = (server_IP, Server_port)
Client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Client_socket.bind(local)
Client_socket.setblocking(False)
first = False
except:
print("Failed")
try:
data, connection = Client_socket.recvfrom(512)
except socket.error:
return
if data:
#irrelevant code handling the data...
서버 전송 코드는 다음과 같이 잠 깁니다.
import socket
server_socket = None
server_port = 5000
Data_Port = 3560
print("importing the socket...")
try:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error as msg:
server_socket = None
try:
server_socket.bind(("", server_port))
except socket.error as msg:
server_socket.close()
server_socket = None
if server_socket is None:
print('could not open socket')
ret = False
server_socket.sendto(Data_to_Send, ('client ip here',Data_Port))
ofc 이것은 코드의 일부일 뿐이지 만 관련성이 있다고 생각합니다. 데이터를 전송 / 수신하는 방식으로 오픈 / 포워드 포트없이 데이터를 수신 할 방법이없는 경우 plz는이를 수행 할 수있는 방법을 제안합니다.
UDP 홀 펀칭을 살펴보십시오.
http://en.wikipedia.org/wiki/UDP_hole_punching
기본 전제는 클라이언트가 먼저 NAT 라우팅 테이블에 항목을 생성하여 서버에 연결한다는 것입니다. 그런 다음 서버는 요청을보고 NAT 라우터가 요청을 보내는 데 사용한 포트를 확인합니다. 이 포트로 UDP 패킷을 보낼 수 있어야하며, 그런 다음 사설 네트워크의 클라이언트로 전달되어야합니다.
요약하면 포트를 3560
. UDP 패킷의 출처에 따라이 포트를 변경해야합니다.
연결 기반 프로토콜 (UDP는 비 연결형) 인 TCP 사용을 고려할 수도 있습니다. 클라이언트에서 서버로 연결이 설정되면이 연결을 통해 데이터를주고받는 것이 매우 쉽습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다