すべての文字列を一度に連結する必要はありません。とにかく下で発生するため、これは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);
}
}