SFML UdpSockets не отправлять / получать без ошибок? - PullRequest
0 голосов
/ 31 мая 2018

Я работаю над примитивной многопользовательской игрой на линкорах для моего класса CS.Я могу запустить его и отправить информацию по локальной сети.Чтобы проверить, работает ли эта связь, я создал цикл с функцией слушателя, который останавливается, когда проверяется, что пакет получен из потока прослушивания другого компьютера.

Когда я делаю это, кажется, что он отправляетпакет, но цикл продолжает работать вечно без каких-либо ошибок и без получения подтверждения того, что пакеты были получены другим компьютером.Есть ли у вас какие-либо идеи, что может произойти?

//SFML headers
#include <SFML/Network.hpp>
//standard headers
#include <vector>
#include <iostream>
#include <string>
#include <thread>
#include <atomic>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <exception>


std::atomic_bool running;
unsigned short port;

//Functions for threading

void startListen(sf::UdpSocket *sock, std::atomic_bool *r, sf::IpAddress *ip)
{
    std::cout<<"Listener started"<<std::endl;
    while(*r == true)
    {
        sf::sleep(sf::microseconds(50));
        std::cout<<"Wait done"<<std::endl;
        std::cout<<std::to_string(port)<<" port from the listen thread."<<std::endl;
        sf::IpAddress sender;
        sf::Packet p;
        std::cout<<"tryna receive packet"<<std::endl;
        if (sock->receive(p, sender, port) != sf::Socket::Done)
        {
            std::cout<<"Attempt at packet retrieval but packet retrieval failed! Error code 23./nPlease contact developer at mldevelopingstudios@gmail.com to report this failure."<<std::endl;
        }
        std::cout<<"Packet received!"<<std::endl;
        std::string type;
        p >> type;
        std::cout<<"packet recieved, type: "<<type<<std::endl;
    }
}


int main()
{
    port = 4343;

    sf::UdpSocket sock;
    sf::UdpSocket recSock;
    if (recSock.bind(port) != sf::Socket::Done)
    {
        std::cout<<"Whoops we crashed!!!!!!!!!!";
        return 0;
    }
    //sock.unbind();

    std::string ip;
    sf::IpAddress IP1 = sf::IpAddress::getLocalAddress();
    sf::String ip11 = IP1.toString();
    std::cout<<"You LAN IP is: "<<ip11.toAnsiString()<<std::endl;
    std::cout<<"Please enter the target IP address of the computer you'd like to play with."<<std::endl;
    std::string iiii;
    std::cin>>iiii;
    sf::String o(iiii);
    ip = o;
    sf::IpAddress IP(ip);

    std::thread listen(startListen, &recSock, &running, &IP);
    listen.detach();

    std::cout<<"Connection check"<<std::endl;
    running = true;

    std::string name;
    std::cout<<"Name? "<<std::endl;
    std::cin>>name;

    while(running == true)
    {
        std::string mess = name;
        sf::Packet packk;
        std::string temp;
        std::cout<<"Message: "<<std::endl;
        std::cin>>temp;
        if(temp == "!!STOP!!")
        {
            running = false;
        }
        else
        {
            mess = mess+ ": "+ temp;
            packk<<mess;
            if(sock.send(packk, IP, port)!= sf::Socket::Done)
            {
                std::cout<<"Sending error in test loop!!!!"<<std::endl;
            }
        }
    }

    recSock.unbind();
    return 0;
}

Любая помощь очень ценится, спасибо и хорошего дня.

РЕДАКТИРОВАТЬ: новый код является "минималистским кодом" ивсе еще никаких ошибок, но ничего не получено ни на одном конце.

РЕДАКТИРОВАТЬ: Добавлен код, чтобы показать, что происходит

//SFML headers
#include <SFML/Network.hpp>
//standard headers
#include <vector>
#include <iostream>
#include <string>
#include <thread>
#include <atomic>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <exception>


std::atomic_bool running;
unsigned short port;

//Functions for threading

void startListen(sf::UdpSocket *sock, std::atomic_bool *r, sf::IpAddress *ip)
{
    std::cout<<"Listener started"<<std::endl;
    while(*r == true)
    {
        unsigned short por = 4343;
        sock->setBlocking(false);
        std::cout<<std::to_string(por)<<" port from the listen thread."<<std::endl;
        sf::IpAddress sender;
        sf::Packet p;
        std::cout<<"tryna receive packet"<<std::endl;
        sf::Socket::Status stat = sock->receive(p, sender, por);
        switch(stat)
        {
            case(sf::Socket::Done):
            {
                std::cout<<"Packet receiving completed!"<<std::endl;
                std::cout<<"Packet received!"<<std::endl;
                std::string type;
                p >> type;
                std::cout<<"packet recieved, type: "<<type<<std::endl;
                break;
            }
            case(sf::Socket::NotReady):
                std::cout<<"Socket not ready to received!"<<std::endl;
                break;
            case(sf::Socket::Partial):
                std::cout<<"socket Kinda received?"<<std::endl;
                break;
            case(sf::Socket::Disconnected):
                std::cout<<"Socket disconnected!"<<std::endl;
                break;
            case(sf::Socket::Error):
                std::cout<<"Errorrrrrrrrrrrrrrrrrrr"<<std::endl;
                break;
            default:
                std::cout<<"Oh noooooo"<<std::endl;
                break;
        }
    }
}


int main()
{
    port = 4343;

    sf::UdpSocket sock;
    sf::UdpSocket recSock;
    if (recSock.bind(port) != sf::Socket::Done)
    {
        std::cout<<"Whoops we crashed!!!!!!!!!!";
        return 0;
    }
    std::string ip;
    sf::IpAddress IP1 = sf::IpAddress::getLocalAddress();
    sf::String ip11 = IP1.toString();
    std::cout<<"You LAN IP is: "<<ip11.toAnsiString()<<std::endl;
    std::cout<<"Please enter the target IP address of the computer you'd like to play with."<<std::endl;
    std::string iiii;
    std::cin>>iiii;
    sf::String o(iiii);
    ip = o;
    sf::IpAddress IP(ip);

    std::thread listen(startListen, &recSock, &running, &IP);
    listen.detach();

    std::cout<<"Connection check"<<std::endl;
    running = true;

    std::string name;
    std::cout<<"Name? "<<std::endl;
    std::cin>>name;

    while(running == true)
    {
        std::string mess = name;
        sf::Packet packk;
        std::string temp;
        std::cout<<"Message: "<<std::endl;
        std::cin>>temp;
        if(temp == "!!STOP!!")
        {
            running = false;
        }
        else
        {
            mess = mess+ ": "+ temp;
            packk<<mess;
            sf::Socket::Status stat = sock.send(packk, IP, port);
            switch(stat)
            {
                case(sf::Socket::Done):
                    std::cout<<"Packet Sending completed!"<<std::endl;
                    break;

                case(sf::Socket::NotReady):
                    std::cout<<"Socket not ready to send!"<<std::endl;
                    break;
                case(sf::Socket::Partial):
                    std::cout<<"socket Kinda sent?"<<std::endl;
                    break;
                case(sf::Socket::Disconnected):
                    std::cout<<"Socket disconnected!"<<std::endl;
                    break;
                case(sf::Socket::Error):
                    std::cout<<"Errorrrrrrrrrrrrrrrrrrr"<<std::endl;
                    break;
                default:
                    std::cout<<"Oh noooooo"<<std::endl;
            }
        }
    }

    recSock.unbind();
    return 0;
}

Сокет на принимающей стороне постоянно сообщает sf :: Socket :: NotReadyОтчеты об отправке sf :: Socket :: Done С обоих концов ничего не получено, если для блокировки установлено значение true или false

1 Ответ

0 голосов
/ 05 июля 2018

Я как-то решил проблему путем повторного тестирования.Я полагаю, что моя ошибка произошла из-за перегрузок операторов для загрузки моих классов в пакет.Или это была моя запись IP.Один из двух, исправил это.К сожалению, я не задокументировал исправление, хотя уверен, что это была одна из двух проблем.

...