2011-12-08 28 views
0

我有一個需要發送的uchar緩衝區。它不能轉換爲字符。通過winsock2發送uchar *

我有蒙上了樣本項目:

send(SOCKET s, void *buf, size_t length) { return send(s, buf, length, 0); 

我的嘗試是:

err = send(ConnectSocket, (void*)buf, (int)strlen(sendbuf), 0); 

我知道是唯一不同的是VS的版本(2008年)。

該行不會在我的2010項目中編譯。該錯誤是不能paramerter 2 void *的轉換爲const char *

回答

1

試試這個:

err = send(ConnectSocket, (char*)buf, (int)strlen(sendbuf), 0); 
+0

不會簽署緩衝區嗎?這些值不能被簽名。 – Bluebaron

+0

@Bluebaron爲什麼要這樣呢?它只是投射指針,最終將其轉換爲「void *」,因此無論如何都沒有任何符號的概念。演員不只是改變它指向的數據,'發送'功能不關心任何類型,它只是複製原始內存。 –

1

由於send想要一個const char*,而不僅僅是一個char*,你不能僅僅通過一個簡單的void*,因爲C++沒有按」 t支持向/從void*隱式轉換。所以,你必須明確地將其轉換爲char*const char*

err = send(ConnectSocket, (const char*)buf, (int)strlen(sendbuf), 0);  

請記住,鑄造指針不會奇蹟般地改變你的緩衝區中的數據的符號性,因爲發送不關心任何符號性和只是複製原始數據。

但是至於爲什麼它與VS2008一起工作,我不知道,因爲C++不會根據標準隱式地向/從void*投射。也許send的定義不同(我懷疑)或規則只是鬆懈(非標準符合)。或者,也許你將它編譯爲C,然後依據標準隱式地將其轉換爲void*

+0

同樣的編譯問題。但我明白你的觀點。 – Bluebaron

+0

@Bluebaron好吧,我更新了它。我很困惑你爲本地'send'編寫一個包裝器,然後使用本地'send'而不是你的包裝器。我只是想你的第二行使用你的包裝功能。 –