簡體   English   中英

如何通過套接字發送wstring變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM