[英]Issues with converting a constant char array to an unsigned char pointer
我一直在從事一個項目,男孩哦,男孩在這個項目上受了傷。 我正在使用一個名為“ enet ”的網絡庫,並且正在嘗試分配連接信息的客戶端。 使用該站點上的教程,我使用: server.event.packet->data = "client info";
但是,enet抱怨該字符串不是“ unsigned char *”。 這是構建日志(使用clang ++進行編譯):
./network.h:9:14: warning: in-class initialization of non-static data member accepted as a C++11 extension [-Wc++11-extensions] int clients = 0; ^ main.cpp:142:28: error: assigning to 'enet_uint8 *' (aka 'unsigned char *') from incompatible type 'const char [12]'; server.event.packet->data = "client info"; ^ ~~~~~~~~~~~~~
我已經嘗試過我能想到的並且已經尋找過的每種類型的演員,但似乎沒有任何效果。 我不能使該死的東西開心。
Main.cpp:
#include <iostream>
#include <string>
#include <sstream>
#include <istream>
#include <cstring>
#include <cstdio>
#include <unistd.h>
#include <stdio.h>
#include "network.h"
#include "clients.h"
#include "config.h"
void runCommand(std::string command);
int startNetwork();
void shutdownNetwork();
void addClientRecord();
std::string getUsername();
std::string username;
bool manualInput = false;
bool debug = true;
int iPeerCount = 0;
Server server;
int main(int argc, char ** argv){
std::string currentCommand;
if(manualInput==true){
std::cout << "Please type a command: ";
std::getline(std::cin,currentCommand);
if(debug == true){
std::cout << currentCommand << std::endl;
}
runCommand(currentCommand);
}
startNetwork();
atexit(shutdownNetwork);
return 0;
}
int startNetwork(){
if (enet_initialize () != 0){
std::cout << "\nAn error has occured while initializing ENet.\n";
return EXIT_FAILURE;
}
server.startServer();
return 1;
}
void shutdownNetwork(){
enet_deinitialize();
}
int Server::startServer(){
// server.serverOne = enet_host_create (& server.address, 32, 2, 0, 0);
// if(CUSTOM_HOST == true){
// enet_address_set_host(&address, HOST);
// } else {
server.address.host = ENET_HOST_ANY;
// }
server.address.port = PORT;
server.serverOne = enet_host_create( & server.address, 32, 2, 0, 0);
if(debug==true){
printf("[NETWORK] Host: %x \n[NETWORK] Port: %u\n", server.address.host, address.port);
}
if(server.serverOne==NULL){
std::cout << "\nAn error has occured while starting the ENet server.\n";
exit (EXIT_FAILURE);
}
monitor();
return 1;
}
void Server::monitor(){
int clients = 0;
if(debug==true){
printf( "[NETWORK] Waiting for commands...\n" );
}
printf("[NETWORK] Server online, awaiting commands and/or connections...\n");
scan_network:
while(enet_host_service (serverOne, & event, 1000) > 0){
switch(event.type){
case ENET_EVENT_TYPE_CONNECT:
clients++;
printf("[INFO] New connection from: %x:%u.\n", event.peer -> address.host, event.peer -> address.port);
addClientRecord();
/* for(int x=0;x<32;x++){
if(clients[x].name != ""){ }
else{
clients[x].name = "full";
}
}*/
break;
case ENET_EVENT_TYPE_RECEIVE:
if(debug==true){ printf("A packet of length %lu containing %s was received from %s on channel %u.\n", event.packet -> dataLength, event.packet -> data, event.peer -> data, event.channelID); }
runCommand(reinterpret_cast<const char*>(event.packet -> data));
enet_packet_destroy(event.packet);
/* printf("Disconnect client %s ? ", event.peer -> data);
gets(buffer);
std::cout<<buffer<<std::endl;
if(buffer=="yes"){
enet_peer_disconnect(event.peer, 0);
}*/ //Do not use until fixed or spam!
break;
case ENET_EVENT_TYPE_DISCONNECT:
clients--;
printf("%s disconnected.\n", event.peer -> data);
event.peer -> data = NULL;
case ENET_EVENT_TYPE_NONE:
break;
}
}
goto scan_network;
}
void runCommand(std::string command){
if((command == "disconnect") || (command == "Disconnect") || (command=="DISCONNECT")){
enet_peer_disconnect(server.event.peer,0);
printf("[INFO] Client %s issued the disconnect command.\n", server.event.peer -> data);
}
}
std::string getUsername(){
return username;
}
void addClientRecord(){
std::string bufferName = ("client " + server.clients);
server.event.packet->data = "client info";
}
Network.h:
#include <enet/enet.h>
class Server {
public:
ENetAddress address;
ENetHost * serverOne;
ENetEvent event;
int clients = 0;
int startServer();
void monitor();
};
任何想法和幫助將不勝感激。 干杯!
據我所知, server
是Server
類型的結構,它的字段event
是ENetEvent
,它的字段packet
是_ENetPacket*
類型,它的字段數據是一個unsigned char*
。 所以現在發生了什么:在堆棧上創建一個сstring,然后將第一個元素的地址分配給全局對象的data
字段,然后離開該函數,並且指針仍然處於活動狀態,而存儲的數據不再可用。 這就是為什么在對unsigned char*
使用正確的類型轉換時會出現segfault的原因。 因此,您應該執行以下操作:
void addClientRecord()
{
std::string bufferName = ("client " + server.clients);
char* clientName = "client info";
// Allocate mem
char* data = new unsigned char[strlen(clientName)];
// Copy string there
strcpy(data, clientName);
// Store pointer
server.event.packet->data = (unsigned char*)data;
}
並且不要忘記清除分配的內存。 那是因為您應該始終檢查server.event.packet->data
包含非nullptr值,如果包含,則刪除-然后僅分配。 而且,您應該為Server
提供一個析構函數,如果有的話,它將刪除該字符串,並且構造函數會在啟動時在其中寫入nullptr,這樣您就不會刪除某些垃圾地址,這肯定會導致崩潰。 但是首先,您需要確定_ENetPacket
或ENetEvent
類是否為上述data
提供任何功能。 這是字符串的工作方式。
PS應該有一個編譯器標志,它將在默認情況下將char
切換為無符號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.