2010-12-03 20 views
1

它表示here發送函數期望const char *。如何使用winsock的send()函數發送寬字符?

如何發送寬字符?我嘗試了以下內容:

void MyClass::socksend(const wchar_t* wbuffer) { 
    int i; 
    char *buffer = (char *)malloc(MB_CUR_MAX); 
    wctomb_s(&i,buffer, MB_CUR_MAX, (wchar_t)wbuffer); 
    int buflen = strlen(buffer) + 2; 
    char sendbuf[DEFAULT_BUFLEN]; 
    strcpy_s(sendbuf,buflen,buffer); 
    sendbuf[buflen - 1] = '\n'; 
    int senderror = send(this->m_socket, sendbuf, buflen, 0); 
    // error handling, etc goes here... 

} 

這並沒有達到我期望的效果。它似乎沒有發送任何東西到套接字。我該如何解決?

回答

0

請注意,我不確定跨套接字傳輸寬字符串的正確方法,因此對於該部分,您是獨立的。我知道這已經被描述爲非常多毛和令人費解。 :) 考慮到這一點,如果套接字的另一邊期待爲wchar_t的字符串,可以使用wcslen得到字符串的長度到wbuffer點,給你

 
int senderror = send(this->m_socket, (char *)wbuffer, wcslen(wbuffer) * sizeof(wchar_t), 0); 

也有你的代碼中有一些可能的錯誤。 如果您需要將wchar_t字符串轉換爲多字節,則應該使用wcstombs_s而不是wctomb_s。 wctombs_s一次轉換一個字符,而wcstombs_s轉換一個字符串。

如果結果字符串長於DEFAULT_BUFLEN,您將最終使用'\ n'對字符串進行修改,並丟棄長度超過DEFAULT_BUFLEN的任何數據。

send並不總是發送整個緩衝區。您需要循環呼叫才能發送,直到發送完所有字節,或者您的時間或重試次數或耐心等級達到某些限制。

有關更多指導,請參閱here

0

首先是什麼寬字符?它是比8位寬的整數值;這意味着你將不得不處理Endianness。您需要將寬字符數組編碼爲char數組,然後將其作爲char數組發送。在接收端,您需要將char數組解碼爲寬字符數組。

函數wctomb_s只編碼一個單寬字符字符數組。您正在編碼的功能寬字符數組字符數組是wcstombs_s。相應地,解碼使用mbstowcs_s。

錯誤處理ommitted(未測試):

void MyClass::socksend(const wchar_t* wbuffer) { 
    // determine the required buffer size 
    size_t buffer_size; 
    wcstombs_s(&buffer_size, NULL, 0, wbuffer, _TRUNCATE); 

    // do the actual conversion 
    char *buffer = (char*) malloc(buffer_size); 
    wcstombs_s(&buffer_size, buffer, buffer_size, wbuffer, _TRUNCATE); 

    // send the data 
    size_t buffer_sent = 0; 
    while (buffer_sent < buffer_size) { 
     int sent_size = send(this->m_socket, buffer+buffer_sent, buffer_size-buffer_sent, 0); 
     buffer_sent += sent_size; 
    } 

    // cleanup 
    free(buffer); 
}