面向連線、可靠、有序、雙向位元組流。
getaddrinfo() 取得位址(SOCK_STREAM)。socket()、bind()。listen(sfd, backlog) 建立連線佇列。accept() 取得已連線 Socket(cfd)。read(cfd, buf, ...) 接收資料。cfd、sfd、freeaddrinfo()。getaddrinfo()、socket()。connect(cfd, res->ai_addr, res->ai_addrlen) 主動連線。write(cfd, buf, ...) 送資料。close(cfd)、freeaddrinfo()。listen(sfd, 2);
int cfd = accept(sfd, NULL, NULL);
read(cfd, buf, BUF_SIZE);
printf("[server] received: %s\n", buf);
connect(cfd, res->ai_addr, res->ai_addrlen);
write(cfd, buf, sizeof(buf));
printf("[client] sent: %s\n", buf);
gcc server.c -o server
gcc client.c -o client
./server &
./client # 第一次送 "hello"
./client # 第二次送 "stream"
[client] sending data (hello ) to server by socket
[server] receiving data (hello) from client by socket
[client] sending data (stream ) to server by socket
[server] receiving data (stream) from client by socket
單執行緒迭代模型一次只能服務一個連線;高併發需搭配 fork/pthread/epoll。