2017-09-25 4 views
-1

저는 현재 UDP를 사용하여 SFML을위한 네트워크 프로토 타입을 만들고 있습니다. 나는 당신이 서버 또는 클라이언트로 선택할 수있는 응용 프로그램을 만들었습니다. 따라서 대개 응용 프로그램의 인스턴스를 두 개 시작하여 하나는 서버로, 다른 하나는 클라이언트로 만듭니다. 내 로컬 IP 127.0.0.1에 연결 중입니다.SFML로 포트에 UDP 소켓을 바인드하려고 할 때 오류가 발생하는 이유는 무엇입니까?

약 20 분 전에이 EXACT 코드가 작동했으며 아무런 문제가 없었습니다. 아무것도 변경하지 않았지만이 코드는 더 이상 작동하지 않으며 서버에 socket.bind()을 호출하면 프로그램이 중단됩니다. 클라이언트 측에서 오류가 표시되지 않습니다.

이것은 C++에서 수행됩니다.

누구나 가능한 원인을 알고 있습니까? 내가 아는 한, 항만은 사용 중이 아닙니다.

내 클라이언트 코드 :

void runUdpClient(unsigned short port){ 
    sf::IpAddress server; 
    do 
    { 
     std::cout << "Type the address or name of the server to connect to: "; 
     std::cin >> server; 
    } while (server == sf::IpAddress::None); 

    sf::UdpSocket socket; 

    sf::Packet clientSendPacket; 
    std::string packetSendContent = "Packet data from the client"; 
    clientSendPacket << packetSendContent; 
    if (socket.send(clientSendPacket, server, port) != sf::Socket::Done) 
     return; 
    std::cout << "Message sent to the server: \"" << packetSendContent << "\"" << std::endl; 

    // Maak variabelen 
    sf::IpAddress sender; 
    unsigned short senderPort; 
    sf::Packet clientReceivePacket; 
    std::string clientReceiveContent; 
    if (socket.receive(clientReceivePacket, sender, senderPort) != sf::Socket::Done) 
     return; 

    clientReceivePacket >> clientReceiveContent; 
    std::cout << "Message received from " << sender << ": \"" << clientReceiveContent << "\"" << std::endl; 

} 

내 서버 코드 :

void runUdpServer(unsigned short port){ 
    sf::UdpSocket socket; 

    if (socket.bind(port) != sf::Socket::Done) 
     std::cout << "Error binding socket for server"; 
     return; 

    std::cout << "Server is listening to port " << port << ", waiting for a message... " << std::endl; 

    sf::Packet serverReceivePacket; 
    std::string serverReceiveContent; 
    sf::IpAddress sender; 
    unsigned short senderPort; 

    if (socket.receive(serverReceivePacket, sender, senderPort) != sf::Socket::Done) 
     std::cout << "Error receiving packet for server"; 
     return; 
    serverReceivePacket >> serverReceiveContent; 
    std::cout << "Message received from client " << sender << ": \"" << serverReceiveContent << "\"" << std::endl; 

    sf::Packet serverSendPacket; 
    std::string serverSendContent = "Packet data from server"; 
    serverSendPacket << serverSendContent; 
    if (socket.send(serverSendPacket, sender, senderPort) != sf::Socket::Done) 
     std::cout << "Error sending packet from server"; 
     return; 

    std::cout << "Message sent to the client: \"" << serverSendContent << "\"" << std::endl; 
} 
+0

'충돌'을 정의하십시오. 오류가 무엇입니까? – EJP

+0

그냥 반환합니다. 이 부분은 실패하는 부분입니다. if (socket.bind (port)!= sf :: Socket :: Done) std :: cout << "소켓에 소켓을 바인딩하는 중 오류가 발생했습니다"; 반환; – Mick

+0

그래서 오류를 출력하고 그것이 무엇인지 알려주십시오. 아직 유용한 정보가 없습니다. – EJP

답변

0

서버 코드에서 if 문에 중괄호가 없으므로 성공 여부에 관계없이 socket.bind()이 종료되는 즉시 항상 return을 실행합니다. 이 코드 :

if (socket.bind(port) != sf::Socket::Done) 
    std::cout << "Error binding socket for server"; 
    return; 

이 코드와 동일합니다 :이 코드를 논리적으로 동일하다

if (socket.bind(port) != sf::Socket::Done) 
    std::cout << "Error binding socket for server"; 
return; 

:

if (socket.bind(port) != sf::Socket::Done) { 
    std::cout << "Error binding socket for server"; 
} 
return; 

공백 서식 C와 C++에 중요하지 않습니다. socket.receive()socket.send()에 서버의 통화에 대한 if 문에

if (socket.bind(port) != sf::Socket::Done) 
{ 
    std::cout << "Error binding socket for server"; 
    return; 
} 

같은 : if 블록의 몸 내부의 여러 문을 수행하려면, 당신은 명시 적으로 괄호가 필요합니다. socket.send() 또는 socket.receive()가 그 if 문이 자신의 몸에 하나의 문을 수행하는 경우 오류가

클라이언트 코드는 오류 메시지를 출력하지 않습니다 (즉, 단지 return), 중괄호는 선택 사항입니다 그래서.

0

대부분 제대로 포트를 닫지 않고 종료 서버. 몇 분 후에 포트를 다시 사용할 수 있습니다 (내 우분투 16.04 시스템에서 2-3 분 정도 걸리며 사용하는 OS에 따라 다를 수 있음)

또는 포트를 변경할 수 있습니다 사용.

+0

불행히도 포트를 변경해도 도움이되지 못했습니다. 나는 약 15 분을 기다렸다. 그러나 그것은 도움이되지 않았다. 윈도우 10을 사용하여 임. 나는 도움이되는지 곧 내 PC를 다시 시작하는 것을 고려하고있다. – Mick

+0

당신은 socket.bind (sf :: Socket :: AnyPort)를 시도해 볼 수있다. 그렇다면 socket.getLocalPort()를 호출하여 포트를 가져올 수 있습니다. – super

+0

불행히도 그 중 하나도 작동하지 않습니다 – Mick

-1

문제는 ifreturn의 형식입니다. Ctrl + Shift + K을 누르면 코드가 다시 포맷되어 작동합니다.

+0

형식화는 실행 코드의 의미를 변경하지 않습니다. 너는 뭔가 다른 것을 고쳤다. – EJP

관련 문제