2017-11-08 5 views
0

소켓을 사용하여 Python으로 다중 연결 서버를 만들지는 않습니다. 실제 프로토콜이 아니라 자체 정의 된 프로토콜을 사용합니다.로컬 클라이언트에서 내 외부 IP 주소를 사용하여 내 서버에 연결하려고하면 Errno 10060

내 로컬 IP (127.0.0.1)를 사용하는 서버가 올바르게 작동하지만 친구가 연결되기를 원하지만이 오류가 계속 발생합니다. [Errno 10060] 연결된 당사자가 제대로 연결되지 않아 연결 시도가 실패했습니다 일정 기간 후에 응답하거나 연결된 호스트가 응답하지 않아 연결이 실패했습니다.

포트를 올바르게 열고 ipconfig에 지정된 ip로 서버 ip를 설정했습니다. 내가 뭔가를 놓치고 있거나 뭐라도 잘못하고있는 걸까요?

def initialize(): 

    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Setup a server socket 

    server_port = raw_input("Enter the port to run the server on\n") # Ask the admin for port 
    while server_port.isdigit() is not True: 
     server_port = raw_input("Enter the port to run the server on\n") 

    server_socket.bind((LOCAL_IP, int(server_port))) # Bind the server socket to this computer 

    inputs.append(server_socket) 

    terminated = False 
    while not terminated: 

     readable_sockets, writable_sockets, error_sockets = select.select(inputs, outputs, []) # check which of the 
     handle_inputs(readable_sockets, server_socket) 
     handle_messages(writable_sockets) # this works on my local ip server 
     # sockets we expect to use are actually free 


def handle_inputs(readable_sockets, server_socket): 
    """ 
    This functions purpose is to read all inputs given by users, and create new requests accordingly 

    :param readable_sockets: a list of sockets which are waiting to be read 
    :param server_socket: the socket of the server 
    """ 

    for cur_socket in readable_sockets: 

     if cur_socket is server_socket: 
      new_socket, new_ip = server_socket.accept(1) 

      answers_queue.append(Answer(new_socket, Answer.HND_TYPE, 9, "handshake")) 
      if new_socket not in outputs: 
       outputs.append(new_socket) 

이이 relvent 클라이언트 코드는 다음과 같습니다 :

def main(): 
    my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    my_socket.connect((EXTERNAL_IP, PORT)) 
    data = my_socket.recv(1) 
    if data == 'H': 
     print my_socket.recv(int(my_socket.recv(2))) 
    else: 
     print "ERRRRRRRRRRRRRRRRR" 
+0

무엇이'LOCAL_IP'입니까? – Daniel

+0

코드가 깨졌습니다.'recv'는 정확히이 숫자가 아닌 주어진 바이트 수만큼 읽습니다. – Daniel

+0

@Daniel, recv는 내가 작성한 프로토콜을 사용합니다. 그 이유는 하드 코딩 된 번호입니다. 로컬 연결로 작동합니다. –

답변

0

127.0.0.1은 루프백 IP, 그것은 로컬 컴퓨터의 외부에 존재하지 않는 것입니다

이 관련 서버 코드입니다. 서버 소켓을 127.0.0.1에 바인드하면 같은 시스템의 클라이언트 만 127.0.0.1에 연결할 수 있습니다.

서버 컴퓨터가 LAN에 연결되어 있고 동일한 LAN의 클라이언트가 서버 소켓에 연결되도록하려면 서버 컴퓨터의 로컬 LAN IP에 연결하거나 사용 가능한 모든 로컬에 바인딩하려면 0.0.0.0에 바인딩해야합니다 IP.

인터넷의 클라이언트가 서버 소켓에 연결하게하려면 인터넷 연결의 공용 IP에 연결해야합니다.

서버 컴퓨터가 인 경우 직접이 인터넷 모뎀에 연결된 경우 서버 컴퓨터의 LAN IP는 모뎀의 인터넷 IP입니다. 이것이 서버 소켓을 바인드하는 데 필요한 IP입니다. 그러나 서버 시스템이 LAN 라우터 뒤에있는 경우 라우터의 공용 IP에서 서버 시스템의 LAN IP 로의 인바운드 연결을 포트 포워드하도록 라우터를 구성한 다음 서버 소켓을 해당 LAN IP에 바인드해야합니다.

물론 서버 컴퓨터에 방화벽이있는 경우 원하는 포트가 열려 있는지 확인하십시오.

즉, 10060은 연결 오류가 아닌 시간 초과 오류입니다. 표시된 클라이언트 코드는 클라이언트가 연결되는 즉시 서버가 메시지를 보내길 기대합니다. 하지만 서버가 실제로 그 메시지를 보내고 있습니까? 메시지를 대기시키는 코드를 보여 줬지만 실제로 보낸 코드는 표시하지 않았습니다.

+0

매우 이상합니다. 나는 인터넷 클라이언트에서 LAN 뒤의 서버로 갈 것이라고 말했습니다. 하지만 여전히 작동하지 않습니다. 어쨌든 고마워. –

+0

정확하게 "작동하지 않음"을 정의하십시오. 잘못 될 수있는 많은 것들이 있습니다. 클라이언트가 연결되어 있습니까, 예 또는 아니오입니까?예, 클라이언트가 데이터를 수신하고 있습니까, 예 또는 아니오입니까? 정확한 오류보고 위치는 어디입니까? 코드의 어느 단계에서? 정확하게 작동하지 않는 것에 대해 더 구체적으로 설명하십시오. –

+0

Wireshark와 같은 패킷 스니퍼를 사용하여 클라이언트 연결이 서버 시스템에 도달하는지 확인하는 것이 좋습니다. 스니퍼에 표시되지 않으면 라우터가 올바르게 구성되지 않은 것입니다. 스니퍼에서 스니퍼를 볼 수 있지만 서버 코드에서 스니퍼를 볼 수 없다면 서버 코드에 결함이있는 것입니다. –