TCP 发送结构不工作未处理的异常

TCP send struct not working Unhandled exception

所以我想从 tcp 客户端向服务器发送一个 char 和一个 const char,但是我的代码如下

这是发件人

struct packet {
    char caseRadio;//1byte
    const char* path;//4byte
    
};

packet* clientPacket = new packet;

string a = "C:\Users\Desktop\Project phoneedge\ForJen";
clientPacket->caseRadio = '1';
clientPacket->path = a.c_str();

int iSend1 = send(TCPClientSocket, (char*)clientPacket, sizeof(packet), 0);

这是收件人

struct packet {
    char caseRadio;//1byte
    const char* path;//4byte
};

packet* clientPacket = new packet;

int iRecv = recv(sAccecpSocket, (char*)clientPacket, sizeof(packet),0);
cout << clientPacket->caseRadio << endl;
cout << clientPacket->path << endl;

我只收到 caseRadio 的 1 path 在 Barebonesserver.exe:

中的 0x7A8308F0 (ucrtbased.dll) 处抛出未处理的异常

在某些时候路径打印出这样的东西 \source\repos\Barebonesserver\Debug\Barebonesserver.exe (这是项目文件夹路径的一部分,怎么办?)

通过 TCP 发送 const char * 没有意义。一个const char *只是一个字符串在发送进程内存中的地址。它不能神奇地指向 reader 过程中有趣的东西。此外,通过网络发送结构是不可靠的,因为不同的编译选项可能导致结构中的不同填充。

您需要序列化您的数据。一种常见的方式是发送:

  • caseRadio
  • 的单个字符
  • 字符串大小的网络顺序的 16 位整数
  • 字符串的字节数

发件人方(iSend1 的测试省略形式简洁):

...
string a = "C:\Users\Desktop\Project phoneedge\ForJen";

int iSend1 = send(TCPClientSocket, '1', 1, 0);;
int iSend1 = send(TCPClientSocket, htons(a.size()), 2, 0);
int iSend1 = send(TCPClientSocket, a.c_str(), a.size(), 0);

接收方(测试略同上):

char caseRadio
uint16_t size;
char *data;
int iRecv = recv(sAccecpSocket, &caseRadio, 1, 0);
int iRecv = recv(sAccecpSocket, &size, 2, 0);
size = ntohs(size);   // revert to host order...
data = new char[size];
int iRecv = recv(sAccecpSocket, data, size, 0);
string a{data, size};
delete[] data;