SFML UDP-сокет не отправляет пакет - PullRequest
0 голосов
/ 24 сентября 2019

Я очень новичок в программировании, и я экспериментировал с сетевой библиотекой SFML (идея такова: игра в крестики-нолики с сервером и клиентом).

Извините, большинство не на английском, но япришлось бы изменить почти все имена переменных и объектов, и я бы наверняка забыл о некоторых, что вызвало бы больше путаницы.

Я включу весь код, но проблема в отправке пакета

Я пытался зациклить его так, но он просто застревает в этом цикле.

Pakiet.clear();
Pakiet<<MapaStr;

while(Gniazdo.send(Pakiet,IP,port) != sf::Socket::Done)
{
   Pakiet.clear();
   Pakiet<<MapaStr;
}

Проблема:

if (event.mouseButton.button == sf::Mouse::Left && event.type == sf::Event::MouseButtonReleased)
{               
   if(naszKsztalt == kto)
   {
      if(naszKsztalt=='x')
         Pola[myszkaX][myszkaY] = 'x';
      else
         Pola[myszkaX][myszkaY] = 'o';

      for (int q = 0; q < 3; q++)
      {
         for (int t = 0; t < 3; t++)
         {
            MapaStr[q * 3 + t] = Pola[q][t];
         }
      }
      Pakiet.clear();
      Pakiet<<MapaStr;

      Gniazdo.send(Pakiet,IP,port);
   }
}

Весь код клиента, если вынужно это увидеть:

#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
#include <vector>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
int myszkaX,myszkaY;
sf::UdpSocket Gniazdo;
sf::IpAddress IP;
sf::Packet Pakiet;

unsigned short port;
int main()
{sf::Texture txtX,txtO;
if(!txtX.loadFromFile("X.png")) std::cout<<"Wczytywanie tekstury zakonczone niepowodzeniem."<<std::endl;
if(!txtO.loadFromFile("O.png")) std::cout<<"Wczytywanie tekstury zakonczone niepowodzeniem."<<std::endl;

    std::string wiadomosc = "TESTOWA WIADOMOSC";
    std::string IP__;
    std::cout<<"IP serwera"<<std::endl;
   /// std::cin>>IP__;
    std::cout<<"Port na ktorym nasluchuje serwer"<<std::endl;
    std::cin>>port;
    Gniazdo.bind(sf::Socket::AnyPort);

    Gniazdo.send(wiadomosc.c_str(), wiadomosc.size(),IP ,port);
 ///used "IP" here, because  I'd rather it stayed not open to the public 
    char OdebranaWiad[1024];
    std::size_t received = 0;
    Gniazdo.setBlocking(true);

   std::string testowaodp;
   if(!Gniazdo.receive(Pakiet,IP,port)) std::cout<<"nie udalo sie odebrac pakietu"<<std::endl;
    //!(Pakiet >> testowaodp)
    Pakiet >> testowaodp;
    std::cout << IP.toString() << " said: " << testowaodp << std::endl;
    std::cout<<"LUL"<<std::endl;



    Gniazdo.receive(Pakiet,IP,port);
    unsigned short klucz;
    Pakiet>>klucz;
    std::cout<<"Nowy port dla polaczenia z serwerem : "<<port<<std::endl;
    Sleep(3000);
    /*Gniazdo.unbind();
    Gniazdo.bind(port);*/
    Gniazdo.setBlocking(true);

    bool Czy2GraczJest=false;
    std::string tempstr = "Serwer Oczekuje Na Drugiego Gracza";
    std::string XczyO;
    system("cls");

        for(int i = 0;i<tempstr.length();i++)
        {
          std::cout<<tempstr[i];
          Sleep(100);
        }

    bool CzyJa;
    Gniazdo.receive(Pakiet,IP,port);
    Pakiet>>Czy2GraczJest>>XczyO>>CzyJa;
    std::cout<<XczyO<<std::endl;
    Pakiet.clear();






    std::string MapaStr = {"_________"};
        sf::RenderWindow window(sf::VideoMode(900, 900), "SFML works!");
    sf::RectangleShape celownik;
    celownik.setOutlineColor(sf::Color::White);
    celownik.setFillColor(sf::Color(255,219,151,200));
    celownik.setOutlineThickness(3.0f);
    celownik.setOutlineColor(sf::Color(255,219,0,150));
    celownik.setSize(sf::Vector2f(300.f,300.f));
    sf::Sprite PolaSprite[3][3];
    Gniazdo.setBlocking(false);
     for (int i = 0; i<3;i++)
        {
           for (int k = 0; k<3;k++)
           {
               PolaSprite[i][k].setPosition(sf::Vector2f(i*300,k*300));

           }

        }
    char Pola[3][3];

        for (int i = 0; i<3;i++)
        {
           for (int k = 0; k<3;k++)
           {
               Pola[i][k] = ' ';

           }

        }

char naszKsztalt;
char kto ='o';
    if(XczyO == "Jestes O") naszKsztalt = 'o';
        else naszKsztalt = 'x';

bool potwierdzenie = false;
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
        myszkaX = sf::Mouse::getPosition(window).x/300;
        myszkaY = sf::Mouse::getPosition(window).y/300;
        celownik.setPosition(sf::Vector2f(myszkaX*300,myszkaY*300));

            if (event.type == sf::Event::Closed)    window.close();
            if (event.mouseButton.button == sf::Mouse::Left && event.type == sf::Event::MouseButtonReleased)
            {

                if(naszKsztalt == kto)
                {

                if(naszKsztalt=='x')    Pola[myszkaX][myszkaY] = 'x';
                else Pola[myszkaX][myszkaY] = 'o';

                 for (int q = 0; q < 3; q++)
                    {
                        for (int t = 0; t < 3; t++)
                        {
                            MapaStr[q * 3 + t] = Pola[q][t];
                        }
                    }
                   Pakiet.clear();
                    Pakiet<<MapaStr;

                   Gniazdo.send(Pakiet,IP,port) 




                }
            }
        }

        Gniazdo.receive(Pakiet,IP,port);
        Pakiet>>MapaStr>>&kto;

        {
       int q = 0;
       for (int i = 0; i<3;i++)
        {
           for (int k = 0; k<3;k++)
           {

              ///TUTAJ ZE STRING NA CHAR
              Pola[i][k] = MapaStr[q];
            q++;
            }
        }
        }






        for (int i = 0; i<3;i++)
        {
           for (int k = 0; k<3;k++)
           {
               if(Pola[i][k]=='x') PolaSprite[i][k].setTexture(txtX);
               if(Pola[i][k]=='o') PolaSprite[i][k].setTexture(txtO);
           }
        }



        //system("cls");
        std::cout<<MapaStr.size()<<std::endl;
        window.clear();
        std::cout<<"JESTEM W PKT 4"<<std::endl;
        for (int i = 0; i<3;i++)
        {
           for (int k = 0; k<3;k++)
           {
               std::cout<<Pola[i][k];
           }
           std::cout<<std::endl;
        }
        for (int i = 0; i<3;i++)
        {
           for (int k = 0; k<3;k++)
           {
                window.draw(PolaSprite[i][k]);
           }
        }
        window.draw(celownik);
        window.display();
;
    }

    return 0;
}


...