C++ SDLNet:如何定义服务器IP地址

C++ SDLNet:如何定义服务器IP地址,c++,networking,sdl,C++,Networking,Sdl,我尝试将客户端连接到服务器时已成功。但是服务器正在使用环回ip地址。如何使用SDLNet创建服务器,以便我可以从连接到任何网络的任何计算机访问它 问题在于代码,因为我找不到任何地方可以为服务器定义另一个IP地址 以下是服务器的代码: #include "Link\SDL\include\SDL.h" #include "Link\SDL\include\SDL_net.h" #include <iostream> #include <vector> int main(i

我尝试将客户端连接到服务器时已成功。但是服务器正在使用环回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;
}
#包含“Link\SDL\include\SDL.h”
#包括“Link\SDL\include\SDL\u net.h”
#包括
#包括
int main(int argc,char*argv[])
{
SDL_Init(SDL_Init_EVERYTHING);
SDLNet_Init();
int-curid=2;
int playernum=0;
字符数据[1400];
bool running=true;
SDL_事件;
ip地址ip;
SDLNet_解析主机(&ip,NULL,1234);
SDLNet_SocketSet sockets=SDLNet_AllocSocketSet(30);//最大播放器
std::向量socketsvector;
TCPsocket服务器=SDLNet\u TCP\u打开(&ip);
(跑步时)
{
while(SDL_事件和事件))
{
if(event.type==SDL|u QUIT | | event.type==SDL_KEYDOWN&&event.key.keysym.sym==SDLK|u ESCAPE)
{
运行=错误;
打破
}
}
TCPsocket tmpsocket=SDLNet\u TCP\u Accept(服务器);
if(tmpsocket)
{

if(playerNum)您肯定在某个地方定义了环回地址。更改该部分如何?我没有定义此ip地址。这是标准值,但我不知道如何更改它…客户端代码是地址所在的位置,因此您应该发布该地址…在调用
network::network(const char*ipaddress)时传入ip地址
-您没有想过要更改它吗?是的,但它只有在我传递环回地址时才起作用
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;
        }
    }
}