所以我想從 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路徑在 Barebonesserver.exe 的 0x7A8308F0 (ucrtbased.dll) 處引發未處理的例外:
在某些時候,路徑會列印出類似 \source\repos\Barebonesserver\Debug\Barebonesserver.exe 的內容(這是專案檔案夾路徑的一部分,究竟如何?)
uj5u.com熱心網友回復:
通過 TCP發送const char *沒有意義。Aconst 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);
接收方(測驗省略同上):
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/412096.html
標籤:
