我已經搜索論壇,但無法找到適合我的問題的正確答案。我要做一個小登錄過程,所以我想發送數據在編輯框作爲登錄,然後發送數據在第二編輯框作爲密碼。winsock2發送和接收
int ldata2 = send(Socket, buffs, len, 0);//send login via socket
//send pass via socket
int passData = send(Socket, buffPass, lenPass, 0);
以上說明由客戶處理。就當我們可以調用recv即這樣的服務器端:如果在登錄,編輯框是「日誌」:
int dt = recv(SocketM[i],
strings,
128,
0);
int errsock = WSAGetLastError();
if(errsock != WSAEWOULDBLOCK && errsock != 0)
{
std::cout << "ERR CODE " << errsock;
//shutdown(SocketM[Client]);
closesocket(SocketM[Client]);
break;
}
int passdt = recv(SocketM[i],
passstrings,
128,
0);
std::cout << strings << std::endl;//Log and Password in the same buff :(
std::cout << passstrings //nothing in buffer why?
我從buffPass愛好者和數據,而不是僅僅從愛好者的exaple字符串值數據得到並在通過編輯框 - 「通過」我得到LogPass 但我希望從日誌單獨的數據到一個字符串和數據從傳遞到第二。請幫我 請幫幫我。
如果你不想要一個'recv()'中的所有數據,你爲什麼要求長度爲128? –
有沒有辦法在服務端獲得我的緩衝區長度?第三個參數中的recv函數請求緩衝區長度,但我該如何設置? – ak44
發送方知道緩衝區的長度,接收方需要它。兩種方式來做到這一點。選項1 - 定長消息,填充佔用未使用的部分(但要小心填充零填充或其他內容,不要將隨機數據留在那裏,請參閱「Heartbleed」以瞭解爲什麼這很重要)。選項2 - 在數據前面發送長度(EJP在他的回答中提到了長度前綴)。在選項#2中,長度本身是固定大小的,所以問題不會被緩解。 –