0

クライアントをサーバーに接続しようとすると、すでに成功しています。しかし、サーバーはループバック IP アドレスを使用していました。どのネットワークに接続されているどのコンピュータからでもアクセスできるように、SDLNet を使用してサーバーを作成するにはどうすればよいですか?

サーバーの別のIPアドレスを定義できる場所が見つからないため、問題はコードです...

サーバーのコードは次のとおりです。

#include "Link\SDL\include\SDL.h"
#include "Link\SDL\include\SDL_net.h"
#include <iostream>
#include <vector>

int main(int argc, char *argv[])
{
SDL_Init(SDL_INIT_EVERYTHING);
SDLNet_Init();

int curid=2;
int playernum = 0;
char data[1400];
bool running=true;

SDL_Event event;
IPaddress ip;
SDLNet_ResolveHost(&ip,NULL,1234);
SDLNet_SocketSet sockets=SDLNet_AllocSocketSet(30);     //max player
std::vector<TCPsocket> socketsvector;
TCPsocket server=SDLNet_TCP_Open(&ip);

while(running)
{
    while(SDL_PollEvent(&event))
    {
        if(event.type==SDL_QUIT || event.type==SDL_KEYDOWN && event.key.keysym.sym==SDLK_ESCAPE)
        {
            running=false;
            break;
        }
    }
    TCPsocket tmpsocket=SDLNet_TCP_Accept(server);
    if(tmpsocket)
    {
        if(playernum<30)
        {
            SDLNet_TCP_AddSocket(sockets,tmpsocket);
            socketsvector.push_back(tmpsocket);
            sprintf(data,"0 %d \n",curid);
            curid++;
            playernum++;
            std::cout << "new connection. ID: " << curid << std::endl;
        }
        else
        {
            sprintf(data,"3 \n");   //server is full    
        }
        SDLNet_TCP_Send(tmpsocket,data,strlen(data)+1);
    }

    while(SDLNet_CheckSockets(sockets,0) > 0)
    {
        for(int i=0;i<socketsvector.size();i++)
        {
            if(SDLNet_SocketReady(socketsvector[i])==1)
            {
                SDLNet_TCP_Recv(socketsvector[i],data,1400);
                int num=data[0]-'0';
                int j=1;
                while(data[j]>='0' && data[j]<='9')
                {
                    num*=10;
                    num+=data[j]-'0';
                    j++;
                }

                if(num==1)
                {
                    for(int k=0;k<socketsvector.size();k++)
                    {
                        if(k==i)
                            continue;
                        SDLNet_TCP_Send(socketsvector[k],data,strlen(data)+1);
                    }
                }else if(num==2)
                {
                    for(int k=0;k<socketsvector.size();k++)
                    {
                        if(k==i)
                            continue;
                        SDLNet_TCP_Send(socketsvector[k],data,strlen(data)+1);
                    }

                    SDLNet_TCP_DelSocket(sockets,socketsvector[i]);
                    SDLNet_TCP_Close(socketsvector[i]);
                    socketsvector.erase(socketsvector.begin()+i);
                    playernum--;
                    std::cout << "connection closed..." << std::endl;
                    std::cout << playernum << " players in server" << std::endl;
                }
            }
        }
    }
    //SDL_Delay(30);
}
SDLNet_TCP_Close(server);

SDLNet_FreeSocketSet(sockets);

SDLNet_Quit();
SDL_Quit();
return 0;
}

OK、これがクライアントのコードです...

class network{
private:
    SDLNet_SocketSet sockets;
    TCPsocket connection;
    char data[1400];
public:
    network(const char* ip);
    ~network();
    void send(Player* p);
    void receive(std::vector<Enemy*>& enemies, Player* p); //std::vector<unsigned int>& f,std::vector<enemy*>& enemies,std::vector<weapon*> weapons,player* p
    void closeConnection();
};

network::network(const char* ipaddress)
{
    SDLNet_Init();
    IPaddress ip;
    if(SDLNet_ResolveHost(&ip,ipaddress,1234)==-1)
        std::cout << "error while resolving the host (bad ip?)" << std::endl;
    connection=SDLNet_TCP_Open(&ip);
    sockets=SDLNet_AllocSocketSet(1);
    if(sockets==NULL)
        std::cout << "error while connecting (bad ip?)" << std::endl;
    SDLNet_TCP_AddSocket(sockets,connection);
}

void network::closeConnection()
{
    SDLNet_TCP_Send(connection,"2 \n",4);   //close with the server
}

network::~network()
{
    SDLNet_TCP_Close(connection);
    SDLNet_FreeSocketSet(sockets);
    SDLNet_Quit();
}

void network::send(Player* p)
{
    vector3d vec=p->cam.getVector();
    //1 curframe position rotation lookdirection health curweaponnum 
    sprintf(data,"1 %d %f %f %f %f %f %f \n",p->id, p->cam.getLocation().x,p->cam.getLocation().y,p->cam.getLocation().z,vec.x,vec.y,vec.z);
    int size=0;
    int len=strlen(data)+1;

    //SDLNet_TCP_Send(connection,data,len);
    while(size<len)
    {
        size+=SDLNet_TCP_Send(connection,data+size,len-size);
    }
}

void network::receive(std::vector<Enemy*>& enemies, Player* p) //std::vector<unsigned int>& f,std::vector<enemy*>& enemies,std::vector<weapon*> weapons,player* p
{
    SDLNet_CheckSockets(sockets,10);
    if(SDLNet_SocketReady(connection))
    {
        int tmp,num;
        int offset=0;
        do
        {
            offset=SDLNet_TCP_Recv(connection,(char*)data+(offset),1400);
            if(offset<=0)
                return;
        }while(data[strlen(data)-1]!='\n');

        sscanf(data,"%d %d",&num,&tmp);

        //cout << num << " " << tmp << endl;
        cout << data << endl;

        int i=0;
        if(num == 0)
        {
            p->setId(tmp);
        }
        else if(num==1)
        {
            bool NewEnemy = true;
            for(i=0;i<enemies.size();i++)
            {
                if(enemies[i]->id == tmp)
                {
                    int nothing;
                    sscanf(data,"1 %d %f %f %f %f %f %f \n",&nothing, &(enemies[i]->position.x),&(enemies[i]->position.y),&(enemies[i]->position.z),&(enemies[i]->rotation.x),&(enemies[i]->rotation.y),&(enemies[i]->rotation.z));
                    NewEnemy = false;
                    break;
                }
            }
            if(NewEnemy == true && tmp != 0)
            {
                std::cout << "pusing new enemy" << std::endl;
                enemies.push_back(new Enemy(tmp));
            }
        }
        else if(num == 2)
        {
            for(int k = 0; k < enemies.size(); k++)
            {
                if(enemies[k]->id == tmp)
                {
                    enemies.erase(enemies.begin() + k);
                }
            }
        }
        else if(num == 3)
        {
            std::cout << "Could not connect. Server is full." << std::endl;
        }
    }
}

If you can see, I type the IP address for the client when the program starts. But the only value that works is the loopback address.

4

0 に答える 0