0

長い文字列の配列を取得しました。呼び出しでそれらを単一の連結文字列として送信する必要がありsend (int __fd, const void *__buf, size_t __n, int __flags)ます。残念ながら、単一の連結文字列 (char*) を作成するために CPU を消費するプロセスです。文字列の配列を末尾から先頭に送信する機能はありますか?

受信側で複数回起動するsend限り、単一の意味のある文字列に対して複数回呼び出したくありません。recv

リンクリストのような標準化された拡張可能な文字列構造がないのはなぜでしょうか。C/C++そうすれば、読者はバッファの最後にある次のバッファにジャンプできます。std::string少なくともこれを実装したいと思います。

4

2 に答える 2

3

すべての文字列を一度に連結する必要はありません。とにかく下で発生するため、これはCPUをあまり消費しませんが、多くのメモリを消費する場合と消費しない場合があります。

フラグを使用している場合はsend、ソケット バッファ サイズを決定する必要があります。文字列をそのバッファ サイズまで連結してから、send一度に 1 つのバッファずつ連結します

void send_strings(int sockfd, char ** strings, size_t numstrings, int flags) {
    // get the socket write buffer size
    int buflen;
    unsigned int m = sizeof(bufsize);
    if(getsockopt(sockfd,SOL_SOCKET,SO_SNDBUF,(void *)&buflen, &m)) {
        perror("getsockopt"); return; }

    char buffer[buflen];
    int bufsize = 0;

    while (numstrings--) {
        char * string = *(strings++);
        size_t length = strlen(string);

        // if the string would exceed the buffer
        while (length > buflen - bufsize) {
            memcpy(buffer + bufsize, string, buflen - bufsize);

            length -= buflen - bufsize;
            string += buflen - bufsize;

            // send a full buffer
            send(sockfd, buffer, buflen, flags);
            bufsize = 0;
        }
        // copy the string into the buffer
        memcpy(buffer + bufsize, string, length);
        bufsize += length;
    }
    // send the rest
    if (bufsize) {
        send(sockfd, buffer, bufsize, flags);
    }
}
于 2013-10-31T14:06:16.127 に答える
0

http://linux.die.net/man/2/sendMSG_MOREには、フラグ の使用が記載されています。設定すると、フラグsendなしの呼び出しの後にのみ送信が開始されます。そのため、最後のデータ チャンクを除いて、各データ チャンクをMSG_MORE呼び出します。sendMSG_MORE

于 2013-11-14T09:06:40.797 に答える