我是网络编程的新手。我已经完成了一些TCP套接字,并且正在尝试在一个简单的UDP客户端/服务器上使用它。

我正在为该项目使用SDL_net框架。

我遇到的问题是UDPpacket结构使用Uint8 *作为数据的数据类型。但是,我只希望能够直接发送文本。我已经阅读了一些有关强制转换的内容,但似乎没有任何兼容之处,并且我正在努力寻找正确的解决方案。

客户端代码如下所示。正如您所假设的那样,该错误是当我尝试设置p数据时(朝向代码底部)。

您的任何建议或更正将不胜感激!

#include <iostream>
#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2_net/SDL_net.h>

using namespace std;


int main(int argc, const char * argv[]) {

    UDPsocket sd;

    //create the socket
    if(!(sd = SDLNet_UDP_Open(0))) {
        printf("Could not create socket\n");
        SDLNet_Quit();
        SDL_Quit();
        exit(1);
    }

    //get my address
    IPaddress* myaddress = SDLNet_UDP_GetPeerAddress(sd, -1);
    if(!myaddress) {
        printf("Could not get own port\n");
        exit(2);
    }

    cout << "My Port: " << myaddress->port << endl;


    /******************************
    * These are used to recieve
    *******************************/

    UDPpacket * rcvP = SDLNet_AllocPacket(1024);
    if(!rcvP) {
        printf("Could not allocate receiving packet\n");
        exit(3);
    }

    UDPsocket rcvS;
    rcvS = SDLNet_UDP_Open(myaddress->port);
    if(!rcvS)
    {
        printf("Could not allocate receiving socket\n");
        exit(4);
    }

    //resolve the address of the server
    IPaddress srvHost;
    IPaddress * ip = & srvHost;
    SDLNet_ResolveHost(ip, "localhost", 8888);

    //set up the packet
    UDPpacket * p = SDLNet_AllocPacket(1024);
    if(!p) {
        printf("Could not allocate packet\n");
        SDLNet_Quit();
        SDL_Quit();
        exit(2);
    }

    //link the server address to our packet
    p->address.host = srvHost.host;
    p->address.port = srvHost.port;


    //main loop
    while(true){

        SDL_Event e;
        while(SDL_PollEvent(&e))
        {
            if(e.type == SDL_KEYDOWN)
            {
                char * data;
                switch(e.key.keysym.sym)
                {
                    case SDLK_LEFT:
                        p->data = "left";
                        p->len  = strlen("left") + 1;
                        SDLNet_UDP_Send(sd, -1, p);
                        break;
                    case SDLK_RIGHT:
                        p->data = "right";
                        p->len  = strlen("right") + 1;
                        SDLNet_UDP_Send(sd, -1, p);
                        break;
                    default:
                        break;
                }
            }
        }

    }

        return 0;
}

最佳答案

p->data指向SDLNet_AllocPacket已经分配的缓冲区-您需要将字符串数据复制到其中,而不是尝试替换其指向的位置。因此,无论您在哪里使用C字符串数据更新数据包,您都将想做类似的事情:

{
    static const char* data = "left";
    p->len = strlen(data) + 1;
    memcpy(p->data, data, p->len);
}

10-04 13:01
查看更多