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