[英]How do I send a wstring variable over a socket?
我必須在C ++中的客戶端和服務器之間發送信息。 我發現以下代碼允許我通過連接發送整數。
服務器:
int number = 5;
send(clientSocket, (char*)&number, sizeof(number), 0); //Integer is sent to client
客戶:
int number;
recv(serverSocket, (char*)&number, sizeof(number), 0); //Integer is received and assigned to 'number'
但是,我現在正嘗試使用完全相同的代碼發送wstring變量(將'int'替換為'wstring'),但它無法正確發送值。 如何在套接字上發送wstring並在客戶端上接收它?
步驟1:發送者和接收者同意共享字符編碼。 如果您同時編寫發送者和接收者,這很容易。 選一個。 最好在發送和接收平台上選擇一個具有良好C ++支持庫的程序。 UTF-8通常具有良好的支持。
第2步:發送方和接收方就如何發出信號結束字符串達成一致。 在發送字符串之前,將讀取常見選擇,直到NULL並發送字符串的長度。 有時,您希望以字節為單位發送編碼字符串的長度,以使讀取和緩沖編碼字符串變得更加容易。
步驟3:發送方使用約定的編碼將字符串編碼到char
緩沖區中。 不幸的是,這在C ++中比應有的混亂。 您可能會發現自己回到了第1步並重新選擇了編碼,因為您選擇的編碼沒有您想像的那樣好。
步驟4 A:將步驟3中的緩沖區寫入,並在步驟2中選擇了長度確定方法。
步驟4B:從套接字讀取緩沖區,當滿足步驟2中選擇的終止條件時停止。 如果要查找字符串標記的結尾或字符串計數,則必須讀取並緩沖,然后逐字節轉換,並根據需要更多地讀取和緩沖。 如果發送了編碼字符串的大小,則可以一次讀取並緩沖整個字符串,然后使解碼器松動。
要發送C ++類(其中std::wstring
是示例),您必須對其進行序列化 :將其轉換為可以發送和接收的格式。 二進制對象表示(通過獲取對象的地址獲得)不適合該目的。
幸運的是,序列化std::wstring
並不麻煩。 您只需要使用它的c_str()
方法訪問它的字符緩沖區。 您需要記住的唯一一件事是,您還需要告訴接收者字符串的長度-使接收者知道要讀取多少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.