// SPDX-License-Identifier: GPL-2.0-only /* * Copyright 2018 Google Inc. * Author: Soheil Hassas Yeganeh (soheil@google.com) * * Simple example on how to use TCP_INQ and TCP_CM_INQ.
*/ #define _GNU_SOURCE
void *start_server(void *arg)
{ int server_fd = (int)(unsignedlong)arg; struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr); char *buf; int fd; int r;
buf = malloc(BUF_SIZE);
for (;;) {
fd = accept(server_fd, (struct sockaddr *)&addr, &addrlen); if (fd == -1) {
perror("accept"); break;
} do {
r = send(fd, buf, BUF_SIZE, 0);
} while (r < 0 && errno == EINTR); if (r < 0)
perror("send"); if (r != BUF_SIZE)
fprintf(stderr, "can only send %d bytes\n", r); /* TCP_INQ can overestimate in-queue by one byte if we send * the FIN packet. Sleep for 1 second, so that the client * likely invoked recvmsg().
*/
sleep(1);
close(fd);
}
free(buf);
close(server_fd);
pthread_exit(0);
}
int main(int argc, char *argv[])
{ struct sockaddr_storage listen_addr, addr; int c, one = 1, inq = -1;
pthread_t server_thread; char cmsgbuf[CMSG_SIZE]; struct iovec iov[1]; struct cmsghdr *cm; struct msghdr msg; int server_fd, fd; char *buf;
while ((c = getopt(argc, argv, "46p:")) != -1) { switch (c) { case'4':
family = PF_INET;
addr_len = sizeof(struct sockaddr_in); break; case'6':
family = PF_INET6;
addr_len = sizeof(struct sockaddr_in6); break; case'p':
port = atoi(optarg); break;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.