Program Statement
One program demonstrating getsockopt/setsockopt, getpeername/getsockname, and scatter/gather I/O with readv/writev — run it against your echo server.
/* advanced.c — run against the echo server */
int fd = socket(AF_INET, SOCK_STREAM, 0);
int rcvbuf; socklen_t ol = sizeof(rcvbuf);
getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &ol);
printf("default SO_RCVBUF = %d\n", rcvbuf);
rcvbuf = 64 * 1024;
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf));
connect(fd, (struct sockaddr *)&srv, sizeof(srv));
/* writev: header + payload in ONE call (gather write) */
char hdr[] = "LEN:00011\n", payload[] = "hello world";
struct iovec iov[2] = { {hdr, sizeof(hdr)-1}, {payload, sizeof(payload)-1} };
writev(fd, iov, 2);
/* readv: scatter the echo into two buffers */
char b1[10], b2[64];
struct iovec riov[2] = { {b1, sizeof(b1)}, {b2, sizeof(b2)} };
int n = readv(fd, riov, 2);
printf("readv got %d bytes\n", n);
struct sockaddr_in peer; socklen_t len = sizeof(peer); char ip[64];
getpeername(fd, (struct sockaddr *)&peer, &len);
inet_ntop(AF_INET, &peer.sin_addr, ip, sizeof(ip));
printf("connected to %s:%d\n", ip, ntohs(peer.sin_port));
Record Task
Note the default SO_RCVBUF your system reports, and why writev beats two separate write calls (one syscall, and no chance of TCP sending a tiny segment between header and payload — the Nagle interaction).
Theory Link
Unit 2 "Socket Options & Advanced I/O Functions".