【问题标题】:SFML Socket Being set to sf::Socket::Error when sending a packetSFML Socket 发送数据包时设置为 sf::Socket::Error
【发布时间】:2014-02-11 23:37:03
【问题描述】:

我正在尝试使用 UDP 和数据包来创建用于游戏开发的网络框架。我能够接收从客户端发送到服务器的数据包,但是当服务器尝试发送数据包以响应它收到的数据包时,套接字的状态设置为错误并且不发送数据包。以下是受影响的服务器代码:

服务器 .cpp 文件:

#include "ServerCore.hpp"
#include "Packet.hpp"

#include <SFML/Network/IpAddress.hpp>
#include <iostream>

ServerCore::ServerCore(int port)
    : mSocketRecv()
    , mSocketSend()
{
    mPort = port;
}

void ServerCore::enterServerLoop()
{
    if(mSocketRecv.bind(mPort) != sf::Socket::Done)
    {
        std::cout << "SOMETHING DIDNT WORK" << std::endl;
    }
    std::cout << "Initialized Server" << std::endl;

    unsigned short port;
    sf::IpAddress ip;
    while(true)
    {
        std::cout << ":D" << std::endl;

        sf::Packet packet;

        std::size_t recieved;

        if(mSocketRecv.receive(packet, ip, port) != sf::Socket::Done)
        {

        }

        int x;

        if(packet >> x)
        {
            if(x == ClientPacket::PlayerConnect)
            {
                std::cout << "Player Connected!" << std::endl;
                sf::Packet packet;

                packet << ServerPacket::ServerStop;

                if(mSocketSend.send(packet, mSender, 54000) != sf::Socket::Done)
                {
                    std::cout << "I AM SAD" << std::endl;
                }
            }
            if(x == ClientPacket::PlayerDisconnect)
                std::cout << "Player Disconnected!" << std::endl;
            if(x == ClientPacket::PlayerQuit)
                std::cout << "Player Quit!" << std::endl;
            if(x == ClientPacket::PlayerJoin)
                std::cout << "Player Join!" << std::endl;

        }


        std::cout << "Recieved " << recieved << " bytes from " << ip << " on port " << port << std::endl;
    }
}

还有服务器.hpp文件:

#pragma once

#include <SFML/Network/UdpSocket.hpp>
#include <SFML/Network/IpAddress.hpp>
#include <SFML/Network/Packet.hpp>

class ServerCore
{
public:
    ServerCore(int port);
    void enterServerLoop();

private:
    sf::UdpSocket mSocketRecv;
    sf::UdpSocket mSocketSend;

    sf::IpAddress mSender;
    int mPort;
};

这是受影响的代码块(特别是未按预期工作的位置):

        if(x == ClientPacket::PlayerConnect)
        {
            std::cout << "Player Connected!" << std::endl;
            sf::Packet packet;

            packet << ServerPacket::ServerStop;

            if(mSocketSend.send(packet, mSender, 54000) != sf::Socket::Done)
            {
                std::cout << "I AM SAD" << std::endl;
            }
        }

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 什么是x,为什么它没有初始化?
  • X 是一个在 if(packet >> x) 语句中初始化的整数。
  • 有什么想法吗?我似乎无法弄清楚这一点。

标签: c++ networking udp sfml


【解决方案1】:

我会说数据包大于 UdpSocket::MaxDatagramSize (see this),你可以使用getDataSize() 来检查它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2021-02-11
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多