SDL_net UDP 数据包数据
SDL_net UDP Packet data
我是网络编程新手。我已经对 TCP 套接字做了一些工作,我正在尝试使用一个简单的 UDP 客户端/服务器。
我正在为这个项目使用 SDL_net 框架。
我 运行 遇到的问题是 UDPpacket 结构使用 Uint8 *
作为数据的数据类型。但是,我只想能够直接发送文本。我读过一些关于铸造的东西,但似乎没有什么是兼容的,我正在努力寻找正确的解决方案。
客户端的代码如下所示。正如您所假设的那样,错误是在我尝试设置 p-data(靠近代码底部)时出现的。
如有任何建议或更正,我们将不胜感激!
#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);
}
我是网络编程新手。我已经对 TCP 套接字做了一些工作,我正在尝试使用一个简单的 UDP 客户端/服务器。
我正在为这个项目使用 SDL_net 框架。
我 运行 遇到的问题是 UDPpacket 结构使用 Uint8 *
作为数据的数据类型。但是,我只想能够直接发送文本。我读过一些关于铸造的东西,但似乎没有什么是兼容的,我正在努力寻找正确的解决方案。
客户端的代码如下所示。正如您所假设的那样,错误是在我尝试设置 p-data(靠近代码底部)时出现的。
如有任何建议或更正,我们将不胜感激!
#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);
}