-6

文字列の最後に到達するまで、文字列 ech time からある程度の量のテキストを送信する方法を見つけようとしています。例:

const char* the_string = "hello world, i'm happy to meet you all. Let be friends or maybe more, but nothing less"

出力: ハローワールド

出力: 、お会いできてうれしいです。

出力: 友達になりましょう

出力: 、しかしそれ以下ではありません

停止: 送信するバイトはこれ以上ありません。

私はGoogleを検索しましたが、例を理解していませんでした。私は4日間かけて良い方法を見つけようとしました。また、一度に5バイトを送信しましたが、少ない場合は最後まで送信してください文字列。

私を助けてください、それが機能し、よく説明されている限り、私はCまたはC ++の方法を受け入れます。

4

3 に答える 3

2

コメントでの議論によると、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 );

これがあなたが望むものを達成するのに役立つことを願っています.

于 2012-06-10T22:37:11.020 に答える
1

これがCでの解決策です。うまくいけば、あなたの質問を理解できました。

void send_substr(
    const char * str,
    size_t len,
    const size_t bytes_at_a_time,
    void (*sender)(const char *)
    )
/*
   sender() must check the char * manually for
   null termination or call strlen()

   for Unicode just change all size_t to unsigned long
   and all const char * to const wchar_t * (POSIX)
   or LPCWSTR (Win32)
 */
{
  size_t i, index_to_end, tail;

  //for C99 (gcc)
  char ret[bytes_at_a_time];

  //for C89 (Visual C++)
  //char * ret = (char *) malloc(sizeof(char)*bytes_at_a_time);

  tail = len % bytes_at_a_time;
  index_to_end = len - tail;

  for(i = 0; i < index_to_end; i += bytes_at_a_time)
  {
    memcpy(ret, str+i, bytes_at_a_time);
    *(ret + bytes_at_a_time) = '\0';
    (*sender)(ret);
  }
  memcpy(ret, str+index_to_end, tail);
  *(ret + tail) = '\0';
  (*sender)(ret);
  //for C89
  //free(ret);
}

void print_substr(const char * substr)
{
  while(*substr != '\0')
  {
    putchar(*substr);
    substr++;
  }
  putchar('\n');
}

int main()
{
  char test[] = "hello world, i'm happy to meet you all."
    " Let be friends or maybe more, but nothing less";
  send_substr(test, sizeof(test)/sizeof(*test), 5, &print_substr);

  return 0;
}
于 2012-06-11T14:33:02.240 に答える
1

C++ では、部分文字列 (substr) メソッドを使用して、送信する文字列の一部を選択できます。c では、手動で文字を反復処理し、ゼロに達するか目的のバイト数が送信されたときに停止するか、char 配列の一部を別の 0 で終わる配列にコピーして送信する必要があります。

たとえば、次のように一度に 10 文字を送信できます。

string str = randomstaff.from(whereveryoulike);
for (int i = 0; i < str.size(); i += 10)
{
    destination << str.substr(i, i + 10 < str.size() ? i + 10 : str.size());
}
于 2012-06-10T21:48:44.507 に答える