コメントでの議論によると、OPが探しているのは、ソケットを介してデータ全体を送信できる方法だと思います。
C++ とテンプレートを使用して、ソケットを介して任意のデータを送信するのは非常に簡単です(このコード サンプルでは、WinSock を使用します) 。
一般的な送信機能:
template <typename T>
int SendData( const T& tDataBuffer, SOCKET sSock )
{
// Make sure the class is trivially copyable:
static_assert( std::is_pod<T>::value && !std::is_pointer<T>::value, "The object type must be trivially copyable" );
char* chPtr = (char*)(&tDataBuffer);
unsigned int iSent = 0;
for( unsigned int iRemaining = sizeof(T); iRemaining > 0; iRemaining -= iSent )
{
iSent = send( sSock, chPtr, iRemaining, 0 );
chPtr += iSent;
if( iSent <= 0 )
{
return iSent;
}
}
return 1;
}
ポインターのオーバーロード:
template <typename T>
int SendData( T* const &ptObj, unsigned int iSize, SOCKET sSock )
{
// Make sure the class is trivially copyable:
static_assert( std::is_pod<T>::value, "The object type must be trivially copyable" );
char* chPtr = (char*)ptObj;
unsigned int iSent = 0;
for( unsigned int iRemaining = iSize; iRemaining > 0; iRemaining -= iSent )
{
iSent = send( sSock, chPtr, iRemaining, 0 );
chPtr += iSent;
if( iSent <= 0 )
{
return iSent;
}
}
return 1;
}
専門std::string
:
template <>
int SendData( const std::string& szString, SOCKET sSock )
{
// Send the size first:
int iResult = SendData( static_cast<unsigned int>(szString.length()) * sizeof(char) + sizeof('\0'), sSock );
if( iResult <= 0 )
return iResult;
iResult = SendData(szString.c_str(), static_cast<unsigned int>(szString.length()) * sizeof(char) + sizeof('\0'), sSock);
return iResult;
}
これらの機能を利用した例は次のとおりです。
std::string szSample = "hello world, i'm happy to meet you all. Let be friends or maybe more, but nothing less";
// Note that this assumes that sSock has already been initialized and your connection has been established:
SendData( szSample, sSock );
これがあなたが望むものを達成するのに役立つことを願っています.