2013-11-03 41 views
1

我決定重做這個問題來澄清它, 我目前正在使用TCP/IP套接字創建客戶端服務器,現在我沒有與這些相關的問題....將std :: string複製到char *(對於TCP/IP套接字)

現在我有一個輔助功能,它將在一個指針到套接字和一些數據我將發送到服務器,它會建立一個std ::字符串中的格式正是我想要的字符,然後將其轉換爲字符數組,並將其發送到服務器

buffer = new char[tempBuffer.size()]; 
cout << tempBuffer.size() << " ++ " << strlen(buffer) << " ++ " << endl; 
strcpy(buffer, tempBuffer.c_str()); 
cout << buffer << " " << tempBuffer.size() << " ++ " << strlen(buffer) << " ++" << endl; 
write (*socket, buffer, strlen(buffer)); 
delete [] buffer; 

-tempBuffer是一個std ::〜應變gi在助手函數的早期構建,我們不需要擔心,我知道那部分工作正常

現在這一切似乎工作完美時,我運行它在我的功能main()我可以發送儘可能多的客戶端和服務器,因爲我想但是當我使用它到一個UI類並使用它時,我得到一個非常長的glibc錯誤,爲什麼會這樣呢?

+0

如果你正在爲數據傳輸準備一個緩衝區,而你不*使用'std :: vector '和一些非常細緻的序列化(或者只是使用序列化庫)足夠深。你不想發送格式化的數據;你想發送* raw *數據,以特定的形式爲它重建客戶端。序列化協議有很好的理由,你可以考慮它們。 – WhozCraig

+0

爲什麼不直接在''write'中直接使用'.c_str()'? 'write(* socket,tempBuffer.c_str(),tempBuffer.size());'看起來很容易... –

回答

2
cout << *buffer << " " << tempBuffer.size() << " ++ " << sizeof(*buffer) << " ++" << endl; 

這是錯誤的,原因有兩個。首先,buffer不是C風格的字符串。這只是任意數據。所以你不能將它傳遞給operator << (char *)(因爲這是字符串,它如何知道要輸出多少字節?)。其次,sizeof(*buffer)爲1,因爲bufferchar *(它怎麼可能知道大小?)。

你必須自己管理大小。你不能指望operator<<sizeof神奇地知道你有多少字節。您不能將buffer視爲字符串,它只是一個字符數組。

+0

+1,因爲我們看不到它,所以無法確定,但我相信'buffer'是一個'char **'。從我所看到的,特別是'strcpy()',這是編譯的唯一方法。如果是這樣,那麼'sizeof(* buffer)'是一個指針的大小;不是1.也就是說,這個答案的前提仍然是絕對正確的(同樣的問題,只是一個4或8而不是1),並且OP將會很好地仔細消化它。 – WhozCraig

+0

好吧,然後我的混淆從cout作品完全罰款緩衝區,我想讓我們說「客戶端:教師」,輸出和sizof(*緩衝區)輸出4不是1,事實上,當我發送數據到服務器所有發送罰款它可以輸出所有它看起來應該準確的長度,我希望它是,如果我要聲明一個字符數組和調用sizeof(thatArray)我會得到我設置它的大小,當我定義它,也不是名稱'thatArray'真的是一個指向字符列表第一個元素的指針嗎?這與我的動態分配的字符列表有什麼不同? –

+0

哦,buffer是'char **',所以'* buffer'是'char *',指針在你的平臺上是4個字節。不同之處在於你動態分配的字符列表不是C對象。唯一的C對象是一個*指針*。指針的大小在您的平臺上是四個字節。由於它指向一個字符,它指向的大小就是字符的大小。沒有語言對象的大小是你分配的字節數,所以沒有什麼可以傳遞給'sizeof'。 –

相關問題