16

SOで同様の質問を見たことがありますが、私の質問には答えません。ここで、文字列を送信および受信しようとしています:

私は std::string を送信しています:

if( (bytecount=send(hsock, input_string.c_str(), input_string.length(),0))== -1)

これで正しく受信できるでしょうか?

if ((bytecount = recv(*csock, rcv.c_str(), rcv.length(), 0)) == -1)

エラーが発生しています:

エラー: recv 行の 'const void*' から 'void*' [-fpermissive]` への変換が無効です!

4

4 に答える 4

17

最善の方法は、最初に文字列データの長さを固定形式 (uint32_tネットワーク バイト順など) で送信することです。次に、受信者はこれを最初に読み取り、適切なサイズのバッファーを割り当ててから、後で送信されるシリアル化されたメッセージを受信できます。

sdまた、csdすでに存在するソケット記述子であると見なされます。

送信者.cpp

std::string dataToSend = "Hello World! This is a string of any length ...";

uint32_t dataLength = htonl(dataToSend.size()); // Ensure network byte order 
                                                // when sending the data length

send(sd,&dataLength ,sizeof(uint32_t) ,MSG_CONFIRM); // Send the data length
send(sd,dataToSend.c_str(),dataToSend.size(),MSG_CONFIRM); // Send the string 
                                                           // data 

レシーバー.cpp

uint32_t dataLength;
recv(csd,&rcvDataLength,sizeof(uint32_t),0); // Receive the message length
dataLength = ntohl(dataLength ); // Ensure host system byte order

std::vector<uint8_t> rcvBuf;    // Allocate a receive buffer
rcvBuf.resize(dataLength,0x00); // with the necessary size

recv(csd,&(rcvBuf[0]),dataLength,0); // Receive the string data

std::string receivedString;                        // assign buffered data to a 
receivedString.assign(&(rcvBuf[0]),rcvBuf.size()); // string

メリットは。複数のバッファリングされた読み取りと受信した文字列へのコピーをいじる必要はありません。さらに、送信されたデータが最終的に完了すると、受信者側でわかります。

欠点は、最初に長さを送信するときに「プロトコル」のようなものを導入していることです。

于 2013-09-07T21:21:50.087 に答える
6

いいえ、読み取り専用であることを意味しますstd::string::c_str()。正常に戻ったconst char*後、ローカル バッファを割り当て、ローカル バッファから文字列オブジェクトを作成できます。recv

特定の長さのデータを読み取るように関数に指示する必要がありrecvます。たとえば、毎回 512 バイトを読み取る必要があります。

#define DEFAULT_BUFLEN 512
char recvbuf[DEFAULT_BUFLEN];

recv(*csock, recvbuf, DEFAULT_BUFLEN, 0);
于 2013-09-07T07:21:20.543 に答える