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