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



所以我想从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;

我只收到案例Radio的1路径在Barebonesserver.exe中的0x7A8308F0(ucrtbased.dll(处引发未处理的异常:

在某个时刻,路径打印出了这样的内容\source\repos\Barebonessever\Debug\Barebone ssever.exe(这是项目文件夹路径的一部分,只是如何?(

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

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

  • 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);

接收器侧(测试省略ibidem(:

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;

相关内容

最新更新