0

我得到了一系列冗长的字符串。我必须在通话中将它们作为单个连接字符串发送send (int __fd, const void *__buf, size_t __n, int __flags)。恐怕它是一个消耗 CPU 的过程来构造单个连接字符串(char *)。是否可以将字符串数组尾部发送到头部?

send只要recv在接收端多次触发,我就不想多次调用单个有意义的字符串。

我想知道为什么没有像链表C/C++这样的标准化可扩展字符串结构,以便读者可以在缓冲区末尾跳转到下一个缓冲区。我希望至少std::string实现这一点。

4

2 回答 2

3

您不需要一次性连接所有字符串。这不会非常消耗 CPU,因为它无论如何都会发生在下面,但它可能会或可能不会消耗大量内存。

如果您在其中使用标志,send那么您应该确定套接字缓冲区的大小。将您的字符串连接到该缓冲区大小,然后send一次连接一个缓冲区

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/send 说明了MSG_MORE标志的使用。send设置后,只有在没有MSG_MORE标志的调用后才会启动传输。因此,除了最后一个数据块之外,调用send每个数据块。MSG_MORE

于 2013-11-14T09:06:40.797 回答