Socket Programming
BSD Sockets

āđāļĢāļīāđāļĄāļāđāļāļāļąāđāļāđāļāđāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ Berkeley UNIX (BSD) āļĢāļļāđāļ 4.2 āđāļāļĒ BSD āđāļāđāļāļđāļāļāļĨāđāļāļĒāļāļāļāļŠāļđāđāļŠāļēāļāļēāļĢāļāļ° āļāđāļĄāļĩāļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāđāļāļāļēāļĢāļĢāļāļāļĢāļąāļāļĢāļđāļāđāļāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļŠāđāļĨāļ°āļĢāļ°āļāļāđāļāļĢāļ·āļāļāđāļēāļĒāļāđāļ§āļĒāļ§āļīāļāļĩāļāļēāļĢāđāļāļ socket communication āļāļķāđāļāđāļāļ§āļāļīāļāļāļāļ Socket āļāļ·āļāđāļāļ·āđāļāđāļŦāđāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļŠāļāļģāđāļāļīāļāļāļēāļĢāļāđāļēāļāļĢāļ°āļāļāđāļāļĨāđ I/O āđāļāļĒāļĄāļĩāļāļēāļĢāđāļāđ file descriptor āļĢāđāļ§āļĄāļāļąāļ āđāļāļĒāļāļąāđāļ§āđāļāđāļĨāđāļ§āļāļąāļ§āđāļāļĢāđāļāļŠāļĨāļđāļāļāļĩāđāđāļāļīāļāļāļķāđāļāļāļ°āđāļāđāļĢāļąāļāļŠāļ·āļāļāļāļāļāļąāļ§ file descriptors āļĄāļēāļāļēāļāđāļāļĢāđāļāļŠāđāļĄāđ āđāļāļāđāļāđāļāđāļāļĩāļĒāļ§āļāļąāļāļāļĨāđāļāļāļēāļĢāļāļģāļāļēāļāļāļāļ pipe āđāļāđāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāđāļ§āļĒāļ§āļīāļāļĩāļāļēāļĢāđāļāļ pipe āđāļāļāļāļ°āđāļāđāļāđāļāļāļāļīāļĻāļāļēāļāđāļāļĩāļĒāļ§ (single direction) āđāļĨāļ°āļāđāļŠāļ·āđāļāļŠāļēāļĢāļāļąāļāđāļāđāđāļāļĩāļĒāļāļ āļēāļĒāđāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāđāļāļĢāļ·āđāļāļāđāļāļĩāļĒāļ§āļāļąāļāđāļāđāļēāļāļąāđāļ
āļāļąāļāļāļąāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ Berkeley UNIX āļāđāđāļāđāļāļģāđāļŠāļāļāđāļāļ§āļāļīāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļŠāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļŠāļ·āđāļāļŠāļēāļĢāļāļąāļāļ āļēāļĒāđāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāđāļāļĩāļĒāļ§āļāļąāļ āļŦāļĢāļ·āļāļāđāļēāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāđāļāđāđāļāđāļāļ°āļāđāļāļāļāļĒāļđāđāļ āļēāļĒāđāļāđāļĢāļ°āļāļāđāļāļĢāļ·āļāļāđāļēāļĒ TCP/IP (TCP/IP networking) āļĢāļ§āļĄāļāļąāđāļāļĒāļąāļāļĢāļāļāļĢāļąāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāđāļāļāļŠāļāļāļāļīāļĻāļāļēāļ (bidirectional) āđāļāđāđāļāđāļāļāļąāļ āļāļąāļāļāļąāđāļāđāļāļ·āđāļāđāļŦāđāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļŠāļēāļĄāļēāļĢāļāļāļļāļĒāđāļāđāļŠāļāļāļāļīāļĻāļāļēāļāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļŠāđāļĄāđāđāļĨāļ°āđāļāļĢāđāļāļŠāļĨāļđāļāļ āļēāļĒāđāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāđāļāļĩāļĒāļ§āļāļąāļ āļŠāļēāļĄāļēāļĢāļāļāļģāđāļāđāđāļāļĒāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđāļāļąāļāļāđāļāļąāļ socketpair() āļāļķāđāļāđāļāđāļāļāļąāļāļāđāļāļąāļāļāļĩāđāļāļđāļāđāļŦāđāļāļģāļāļēāļāđāļāđāđāļāļĩāļĒāļāđāļāđāļĄāļāđāļāļĩāļĒāļ§ āļāļķāđāļāļāļđāļāđāļĢāļĩāļĒāļāļ§āđāļē UNIX domain āđāļāļĒāļāļēāļĢāļāļēāļĢāđāļāđ AF_UNIX
(Address Format UNIX) āđāļĨāļ° SOCK_STREAM
āļāļĩāđāļāļĒāļđāđāđāļāđāļĨāļāļĢāļēāļĢāļĩ sys/socket.h
āđāļĨāļ°āđāļĨāļāļĢāļēāļĢāļĩ sys/types.h
āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
// simple_socket.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define DATA1 "This data is sent from a child process . . ."
#define DATA2 "This data is sent from a parent process . . ."
/*
* This program creates a pair of connected sockets,
* then forks and communicates over them. This is very
* similar to communication with pipes, however, socketpairs
* are two-way communications objects. Therefore I can
* send messages in both directions.
*/
main() {
int sockets[2], child;
char buf[1024];
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) < 0) {
perror("opening stream socket pair");
exit(1);
}
if ((child = fork()) == -1)
perror("fork");
else if (child) { /* This is the parent. */
close(sockets[0]);
if (read(sockets[1], buf, sizeof(buf)) < 0)
perror("reading stream message");
printf("-->%s\n", buf);
if (write(sockets[1], DATA2, sizeof(DATA2)) < 0)
perror("writing stream message");
close(sockets[1]);
} else { /* This is the child. */
close(sockets[1]);
if (write(sockets[0], DATA1, sizeof(DATA1)) < 0)
perror("writing stream message");
if (read(sockets[0], buf, sizeof(buf)) < 0)
perror("reading stream message");
printf("-->%s\n", buf);
close(sockets[0]);
}
}
$ gcc -o simple_socket simple_socket.c
$ ./simple_socket
-->This data is sent from a child process . . .
-->This data is sent from a parent process . . .
āļāļēāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāđāļēāļāļāđāļāļāļ°āđāļŦāđāļāļ§āđāļēāļāļēāļĢāđāļāđ socketpairs
(āļŦāļĢāļ·āļāđāļĄāđāļāļĢāļ°āļāļąāđāļ pipes) āļāļąāđāļāļāļđāļāļāļģāļāļąāļāđāļāđāļĢāļ·āđāļāļāļāļāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāđāļāļĄāļđāļĨāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļŠāđāļāđāđāļāļāļēāļ°āļāļĨāļļāđāļĄāđāļāļĢāđāļāļŠāļāļĩāđāļāļĒāļđāđāđāļāļāļĢāļ°āļāļđāļĨāđāļāļĩāļĒāļ§āļāļąāļ (āđāļāļĢāđāļāļŠāđāļĄāđāļāļĩāđāļĄāļĩāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĢāđāļāļŠāļĨāļđāļāđāļāļīāđāļĄāļāļķāđāļāļĄāļē) āđāļāļĒāđāļĄāļ·āđāļāđāļŦāļĢāđāļāđāļāļēāļĄāļāļĩāđāļĄāļĩāļāļēāļĢāđāļāļīāļāļāļāļāđāļāđāļĨāļ°āđāļāļĢāđāļāļŠāļāļĩāđāđāļĄāđāđāļāđāļāļĒāļđāđāđāļāļāļĢāļ°āļāļđāļĨāđāļāļĩāļĒāļ§āļāļąāļāļŦāļĢāļ·āļāđāļāļĢāđāļāļŠāļāļĩāđāļāļģāļāļēāļāļāļĒāļđāđāļāļāļĨāļ°āđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāđāļĨāđāļ§ āđāļāđāļĨāļ°āđāļāļĢāđāļāļŠāļāļ°āļŠāļ·āđāļāļŠāļēāļĢāļāļąāļāļāļąāļāļāļĩāđāļĄāđāđāļāđ āđāļāđāļāļ°āļāđāļāļāļŠāļĢāđāļēāļ socket āļāļāļāļāļąāļ§āđāļāļāļāļķāđāļāļĄāļēāđāļāļ·āđāļāđāļāļēāđāļ§āđāļŠāđāļāđāļĨāļ°āļĢāļąāļāļāđāļāļĄāļđāļĨ āđāļāļĒāļāļ°āļāđāļāļāļĄāļĩāļāļēāļĢāļĢāļ°āļāļļāļāļ·āđāļ (name) āđāļŦāđāļāļąāļ socket āđāļāļ·āđāļāđāļāđāđāļāļāļēāļĢāļāđāļēāļāļāļīāļāļāļķāļāļāļąāļ āđāļĄāļ·āđāļāđāļĢāļīāđāļĄāđāļāđāļāļēāļāļāļ·āđāļāđāļŦāļĨāđāļēāļāļąāđāļāļāļ°āļāđāļāļāļāļđāļāđāļāļĨāļāđāļŦāđāđāļāđāļāļŦāļĄāļēāļĒāđāļĨāļāļāļĩāđāļāļĒāļđāđ (address) āļāļķāđāļāđāļĨāļāļāļĩāđāļāļĒāļđāđāļāļāļāđāļāđāļĨāļ° socket āļāļ°āļāļđāļāļĢāļ°āļāļļāđāļŦāđāļāļĒāļđāđāļ āļēāļĒāđāļāļāļ·āđāļāļāļĩāđāļŦāļĢāļ·āļāđāļāđāļĄāļāđāļāļĩāļĒāļ§āļāļąāļ
āđāļāļĒāđāļāļāļēāļ°āđāļāļāļĢāļāļĩāļāļĩāđāđāļāļĢāđāļāļŠāļāļģāļāļēāļāđāļĒāļāļāļąāļāļāļĒāļđāđāļāļāļĨāļ°āđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļāļĩāđāļāļķāđāļāļāļđāļāđāļāļ·āđāļāļĄāļāđāļāļāļĒāļđāđāļāļāļĢāļ°āļāļāđāļāļĢāļ·āļāļāđāļēāļĒāļāļīāļāđāļāļāļĢāđāđāļāđāļ (TCP/IP) āļāđāļāļāļāļēāļĢāļāļ°āļŠāļ·āđāļāļŠāļēāļĢāļāđāļāļĄāļđāļĨāļĢāļ°āļŦāļ§āđāļēāļāļāļąāļ āđāļāđāļĨāļ°āđāļāļĢāđāļāļŠāļāļ°āļāđāļāļāļĄāļĩāļāļēāļĢāļŠāļĢāđāļēāļāļāļ·āđāļāļŠāļģāļŦāļĢāļąāļ socket āļāļķāđāļāļĄāļēāļ āļēāļĒāđāļ Internet domain āđāļāļĩāļĒāļ§āļāļąāļāļāļķāđāļāļāļđāļāļāļąāļāļāļēāļāļĒāļđāđāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āļāļĩāđāļĄāļĩāļāļēāļĢāđāļāđāđāļāļĢāđāļāļāļāļĨāļĄāļēāļāļĢāļēāļāļēāļāļŠāļģāļŦāļĢāļąāļāļĢāļ°āļāļāđāļāļĢāļ·āļāļāđāļēāļĒāļāļĩāđāļāļđāļāļāļģāļŦāļāļāđāļāļĒāļŦāļāđāļ§āļĒāļāļēāļ DAPRA āđāļāđāđāļāđ IP, TCP āđāļĨāļ° UDP āđāļāļĒāļāļĩāđāļŦāļĄāļēāļĒāđāļĨāļāļāļĩāđāļāļĒāļđāđ (address) āđāļ Internet domain āļāļąāđāļāļāļ°āļāļĢāļ°āļāļāļāđāļāļāđāļ§āļĒāļāļĩāđāļāļĒāļđāđāđāļāļĢāļ·āļāļāđāļēāļĒāļāļāļāđāļāļĢāļ·āđāļāļ (machine network address) āđāļĨāļ° āļŦāļĄāļēāļĒāđāļĨāļāļāļāļĢāđāļ (port address)
Socket āļāļąāđāļāļĄāļĩāļāļĒāļđāđāļāđāļ§āļĒāļāļąāļ 3 āļāļĢāļ°āđāļ āļāđāļāļĒāļĒāļķāļāļāļēāļĄāļĄāļēāļāļĢāļēāļāļēāļāļāļāļāđāļāļāđāļāđāļĨāļĒāļĩ TCP/IP āđāļāđāđāļāđ
Datagram Socket
āđāļĢāļĩāļĒāļāļāļĩāļāļāļ·āđāļāļŦāļāļķāđāļāļ§āđāļē Connection less Socket āļāļķāđāļāđāļāđāđāļāļĢāđāļāļāļāļĨ UDP (User Datagram Protocol) āđāļāđāļāļāļąāļ§āļāļģāļŦāļāļāļ§āļīāļāļĩāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢ āđāļāļĒāļāđāļāļĄāļđāļĨāļŦāļĢāļ·āļāđāļāđāļāđāļāđāļ (packet) āđāļāđāļĨāļ°āļāļąāļ§āļāļ°āļāļđāļāļŠāđāļāļāļ datagram socket āļāļĩāđāđāļĒāļāđāļŠāđāļāļāļēāļāļāļąāļāļāļāļāđāļ āļāļąāļāļāļąāđāļāđāļāđāļāđāļāđāļāļāļĩāđāļŠāđāļāļāļēāļāđāļāļĢāļ·āđāļāļāļāđāļāļāļēāļāļāđāļāļ°āļāļđāļāļĨāļģāđāļĨāļĩāļĒāļāļāļĢāļ°āļāļēāļĒāļāļāļāđāļāđāļāđāļāđāļĨāļ°āđāļŠāđāļāļāļēāļ āļāļāļāļķāļāđāļāļĢāļ·āđāļāļāļĢāļąāļāļāļĨāļēāļĒāļāļēāļ āđāļāļĒāđāļāđāļĨāļ°āđāļāđāļāđāļāđāļāļāđāļāļēāļāļāļ°āļĄāļēāļāļķāļāđāļāļĢāļ·āđāļāļāļāļĨāļēāļĒāļāļēāļāđāļāļāđāļĄāđāđāļāđāđāļĢāļĩāļĒāļāļāļēāļĄāļĨāļģāļāļąāļāļāļēāļĄāļāļĩāđāļāļđāļāļŠāđāļāļāļāļāļāļēāļāđāļāļĢāļ·āđāļāļāļāđāļāļāļēāļāļāđāļāļāļŦāļāđāļēāļāļąāđāļ
Stream Socket
āđāļĢāļĩāļĒāļāļāļĩāļāļāļ·āđāļāļŦāļāļķāđāļāļ§āđāļē Connection-oriented Socket āļāļķāđāļāđāļāđāđāļāļĢāđāļāļāļāļĨ TCP (Transport Control Protocol) āđāļāđāļāļāļąāļ§āļāļģāļŦāļāļāļ§āļīāļāļĩāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢ āļāļķāđāļāļāļ°āļĄāļĩāļāļēāļĢāļŠāļāļēāļāļāļēāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāđāļĨāļ°āļāļēāļĢāļąāļāļāļĩāļāļēāļĢāļĢāļąāļāļŠāđāļāđāļāđāļāđāļāđāļ āļāļąāļāļāļąāđāļāļāđāļāļĄāļđāļĨāļŦāļĢāļ·āļāđāļāđāļāđāļāđāļāđāļāđāļĨāļ°āļāļąāļ§āļāļ°āļāļđāļāļŠāđāļāļāļ stream socket āđāļĨāļ°āļāļ°āļāļđāļāļĨāļģāđāļĨāļĩāļĒāļāļŠāđāļāļāđāļēāļāļāđāļāļāļāļēāļāļāļĩāđāļāļđāļāļŠāļĢāđāļēāļāļāļķāđāļāļĄāļēāļāļĩāđāđāļāļĒāļąāļāđāļāļĢāļ·āđāļāļāļāļĨāļēāļĒāļāļēāļāļāļāļāļĢāļāļāđāļ§āļāļŠāļĄāļāļđāļĢāļāđ
Raw Socket
āļŠāđāļ§āļāđāļŦāļāđāļāļ°āļāļāđāļāļāļļāļāļāļĢāļāđāđāļāļĢāļ·āļāļāđāļēāļĒāđāļāđāļ āļŠāļ§āļīāļāļāđ (Switch) āđāļĨāļ° āđāļĢāļēāđāļāļāļĢāđ (Router) āļāļķāđāļāļāļģāļāļēāļāļāļĒāļđāđāđāļāļĢāļ°āļāļąāļ Internet Layer āļāļĩāđāļĄāļĩāļāļēāļĢāļĢāļąāļāļŠāđāļāļāđāļāļĄāļđāļĨāđāļāļĒāđāļĄāđāđāļāđāļĄāļĩāļāļēāļĢāđāļāđāđāļāļĢāđāļāļāļāļĨāđāļŦāļĄāļ·āļāļ datagram āđāļĨāļ° stream socket āđāļāļāļēāļĢāļāļģāļŦāļāļāļĄāļēāļāļĢāļēāļāļēāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢ
āđāļĄāļ·āđāļāđāļāļĢāđāļāļŠāļāļąāđāļāļŠāļāļāļāļĩāđāļāļĒāļđāđāļāđāļēāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļāđāļāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļĢāļ°āļŦāļ§āđāļēāļāļāļąāļāļāļ°āļāđāļāļāļĄāļĩāļŠāļāļēāļāļāļēāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāđāļ§āļĒāļāļąāđāļāļāļāļāļāļēāļĄāđāļāļāđāļāđāļĨāļĒāļĩ TCP/IP āļāļķāđāļāļāļĒāļđāđāđāļāļĢāļ°āļāļąāļāļāļąāđāļ transport (transport layer) āđāļĨāļ°āļāļ°āļāđāļāļāļĄāļĩāļāļēāļĢāļĢāļ°āļāļļāļŦāļĄāļēāļĒāđāļĨāļāļāļāļĢāđāļ (port address) āđāļāļĒāļąāļāđāļāļĢāđāļāļāļāļĨāđāļāļāļāļīāđāļāļāļąāđāļ (application protocol) āļāļĩāđāđāļāļĢāđāļāļŠāđāļāđāļĨāļ°āļāļąāđāļāđāļāđāļāļĒāļđāđāļāđāļ§āļĒ āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāđāļāļĢāđāļāļĢāļĄāļĢāļąāļāļŠāđāļāđāļāļĨāđāļāļĩāđāđāļāđāđāļāļĢāđāļāļāļāļĨ FTP āđāļāļāļēāļĢāļāļģāļŦāļāļāļāļ§āļāļāļļāļĄāļ§āļīāļāļĩāļāļēāļĢāļŠāđāļāđāļāļĨāđāļĢāļ°āļŦāļ§āđāļēāļāļāļąāļ āđāļĢāļĩāļĒāļāļāļēāļĢāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāļāļēāļāļāđāļēāļāļāļĩāđāļ§āđāļē socket programming

āļāļēāļĢāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāļāļēāļāļāđāļēāļ socket āļāļ°āļāđāļāļāļāļģāļāļ§āļēāļĄāđāļāđāļēāđāļāļ§āļīāļāļĩāļāļēāļĢāļāļąāđāļāļāđāļēāļŦāļĄāļēāļĒāđāļĨāļ IP address āđāļāđāļĨāļ°āļāļąāļ§ āđāļĄāđāļ§āđāļēāļāļ°āđāļāđāļāļŦāļĄāļēāļĒāđāļĨāļāđāļāļĢāļ·āļāļāđāļēāļĒ (network ID) āļŦāļĄāļēāļĒāđāļĨāļāđāļāļĢāļ·āđāļāļ (host ID) āđāļĨāļ°āļŦāļĄāļēāļĒāđāļĨāļ netmask address
āļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļĢāļĄ, socket, protocol āđāļĨāļ°āļŦāļĄāļēāļĒāđāļĨāļāļāļāļĢāđāļāļ āļēāļĒāđāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāđāļāļ·āđāļāđāļāđāđāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāđāļāļĄāļđāļĨāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļŠāļāļĩāđāļāļĒāļđāđāļāđāļēāļāđāļāļĢāļ·āđāļāļāļāļąāļ āļāļĢāļ°āđāļāđāļāļāļĩāđāļāđāļēāļŠāļāđāļāļāļĩāđāļāļąāļāļāļąāļāļāļēāļāļ§āļĢāļĢāļđāđāđāļāđāđāļāđ
āđāļāļĢāđāļāļĢāļĄāļŦāļāļķāđāļāđāļāļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļāđāļāļīāļāļāđāļāļāđāļāđāļāđāļāđāļŦāļĨāļēāļĒāļāđāļāļāđāļāđāļāđāļāļ·āđāļāļĢāļąāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļēāļāđāļāļĢāļ·āđāļāļāļ āļēāļĒāļāļāļāđāļāđāļāļĢāđāļāļĄāļāļąāļāđāļāđāļ§āļĨāļēāđāļāļĩāļĒāļ§āļāļąāļ
āđāļāļĢāđāļāļĢāļĄāļŦāļĨāļēāļĒāđāļāļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļāđāļāđāļāđāļāļāđāļāđāļāļāļąāļ§āđāļāļĩāļĒāļ§āļāļąāļāđāļāđāļ§āļĨāļēāđāļāļĩāļĒāļ§āļāļąāļāđāļāđāđāļĄāđāļāđāļāļĒāļāļāđāļŦāđāļāļāļēāļĢāđāļāđāđāļāļĨāļąāļāļĐāļāļ°āļāļĩāđ
āļĄāļēāļāļāļ§āđāļēāļŦāļāļķāđāļāļāđāļāļāđāļāđāļāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļāļđāļāđāļāļĩāđāļĒāļ§āļāđāļāļāđāļĨāļ°āđāļāđāļāļēāļāļāļāļĢāđāļāļāļąāļāđāļāļĩāļĒāļ§āļāļąāļ
āđāļāļĢāđāļāļĢāļĄāļāļĢāļ°āļĒāļļāļāļāđāđāļāđāļĨāļ°āļāļąāļ§āļāļ°āļĄāļĩāļāļēāļĢāđāļāđāļāļąāđāļ TCP āđāļĨāļ° UDP āđāļāļ·āđāļāđāļāđāđāļāļāļēāļĢāļāļąāļāļāļēāļĢāđāļĨāļ°āļĢāļąāļāļŠāđāļāļāđāļāļĄāļđāļĨ
āļāļēāļĄāļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđāļāļĩāđāđāļāļāļāđāļēāļāļāļąāļāđāļ āđāļāđāļ āļāđāļāļāļāļēāļĢāđāļāđāļāļāļ§āļēāļĄāđāļĢāđāļ§āđāļāļāļēāļĢāļŠāđāļāđāļĄāđāļāđāļāļĄāļđāļĨāļāļ°āļŦāļēāļĒāđāļāđāļāđāļēāļāļāđāļāļ°āđāļāđāļāđāļāļāļāļēāļ UDP āļŦāļĢāļ·āļāļāđāļēāđāļāđāļāļāļ§āļēāļĄāļāļđāļāļāđāļāļāļāļāļāļāđāļāļĄāļđāļĨāđāļāļĒāļāļĩāđāļāđāļāļĄāļđāļĨāļāļ°āļāđāļāļāđāļĄāđāļŠāļđāļāļŦāļēāļĒāļāđāļāļ°āđāļāđāļāđāļāļāļāļēāļ TCP āđāļāļāļēāļĢāļĢāļąāļāļŠāđāļāđāļāļ
āđāļāļĨāđ /etc/services āļ āļēāļĒāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļ°āļāļāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāđāļāļĢāđāļāļĢāļĄāđāļŦāđāļāļĢāļīāļāļēāļĢāđāļĨāļ°āđāļāļĢāđāļāļāļāļĨāļāļĩāđāđāļāđāļŦāļĄāļēāļĒāđāļĨāļāļāļāļĢāđāļāđāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāđāļēāļāļāđāļīāļāļāđāļāđāļāđāļāļĢāļ°āļāļąāļāļāļāļ Transport layer

āļāļĢāļ°āđāļ āļāļāļāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļŠāļ·āđāļāļŠāļēāļĢāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļāđāļēāļ socket āļāļąāđāļāđāļāđāļāļāļāļāđāļāđāđāļāđāļ 2 āļāļĢāļ°āđāļ āļāđāļāđāđāļāđ
āļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāđāļāļāļĄāļĩāļāļēāļĢāļŠāļāļēāļāļāļēāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ (connection-oriented āļŦāļĢāļ·āļ connectionful) āļŦāļĄāļēāļĒāļāļķāļāļāđāļāļāļāļĩāđāļāļ°āļĄāļĩāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāđāļāļĄāļđāļĨāļĢāļ°āļŦāļ§āđāļēāļāļāļąāļāļāļąāđāļāļŠāļāļāđāļāļĢāļ·āđāļāļāļāļ°āļāđāļāļāļĄāļĩāļāļēāļĢāļŠāļāļēāļāļāļēāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāđāļŦāđāđāļŠāļĢāđāļāđāļĢāļĩāļĒāļāļĢāđāļāļĒāļāđāļāļ (point-to-point) āđāļāļ·āđāļāđāļŦāđāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāđāļāļĄāļđāļĨāļāđāļēāļāļāđāļāļāļĩāđāļĄāļĩāļāļēāļĢāļŠāđāļāļāđāļāļĄāļđāļĨāļāļĩāđāļāļĢāļāļāđāļ§āļāđāļĨāļ°āļĄāļĩāļāļđāļāļāđāļāļāļāļāļāļāđāļāļĄāļđāļĨāļĄāļēāļāļāļĩāđāļŠāļļāļ āđāļāļĒāļĄāļĩāļāļąāđāļāļāļāļāļāļĢāđāļēāļ§āđāļāļąāļāļāđāļāđāļāļāļĩāđ
āļŠāļĢāđāļēāļ socket āđāļĨāļ°āļĢāļ°āļāļļāđāļāđāļĄāļ --
socket()
āļāļģāļāļēāļĢāļāļđāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļ socket āđāļĨāļ°āļŦāļĄāļēāļĒāđāļĨāļāļāļāļĢāđāļ --
bind()
āļāļģāļāļēāļĢāđāļāļīāļāļāļāļĢāđāļāđāļāļ·āđāļāļĢāļāļāļēāļĢāļāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļēāļāļ āļēāļĒāļāļāļ --
listen()
āđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāļĢāđāļāļāļāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāđāļāļ°āļāļāļāļĢāļąāļāđāļĨāļ°āđāļāļĢāļĩāļĒāļĄāļŠāļāļēāļāļāļēāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļĢāļ°āļŦāļ§āđāļēāļāļāļąāļ --
accept()
āđāļĢāļīāđāļĄāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāđāļāļĄāļđāļĨāļĢāļ°āļŦāļ§āđāļēāļāļāļąāļ --
write()
andread()
āļŠāļīāđāļāļŠāļļāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ --
close()
āļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāđāļāļāđāļĄāđāļāđāļāļāļĄāļĩāļāļēāļĢāļŠāļāļēāļāļāļēāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ (connectionless) āļŦāļĄāļēāļĒāļāļķāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļŠāļēāļĄāļēāļĢāļāļŠāļ·āđāļāļŠāļēāļĢāļāđāļāļĄāļđāļĨāļāļāļāđāļāđāļāđāļāļąāļāļāļĩāđāļāļĒāļāļĩāđāđāļĄāđāļāđāļāļāļĄāļĩāļāļēāļĢāļŠāļāļēāļāļāļēāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāđāļāđāļāļĒāđāļēāļāđāļ āļāļąāļāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāļāđāļāļ°āļāđāļāļāļŦāļēāļ§āļīāļāļĩāļāļēāļĢāđāļāļāļāļīāļāļāđāļēāļāđāđāļāļ·āđāļāļāļģāđāļŦāđāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāđāļāļĄāļđāļĨāļāļđāļāļāđāļāļāļāđāļ§āļĒāļāļąāļ§āđāļāļ āđāļāļĒāļĄāļĩāļāļąāđāļāļāļāļāļāļĢāđāļēāļ§āđāļāļąāļāļāđāļāđāļāļāļĩāđ
āļŠāļĢāđāļēāļ socket āđāļĨāļ°āļĢāļ°āļāļļāđāļāđāļĄāļ --
socket()
āļāļģāļāļēāļĢāļāļđāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļ socket āđāļĨāļ°āļŦāļĄāļēāļĒāđāļĨāļāļāļāļĢāđāļ --
bind()
āđāļĢāļīāđāļĄāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāđāļāļĄāļđāļĨāļĢāļ°āļŦāļ§āđāļēāļāļāļąāļāđāļāđāļāļąāļāļāļĩ --
sendto()
andrecvfrom()
āļŠāļīāđāļāļŠāļļāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ --
close()
āđāļāļĒāļāđāļēāļāļĢāļīāļĒāļēāļĒāđāļĨāđāļ§āļāļēāļĢāļāļģāļāļēāļāļāļāļ sockets āļāļ°āđāļāđāļāđāļāļĨāļąāļāļĐāļāļ°āđāļāļāļāļđāļāļāļģāļŦāļāļāđāļŦāđāļŦāļĒāļļāļāļĢāļ (blocking) āļāļąāļāļāļąāđāļāļāļąāļāļāđāļāļąāļāļāđāļēāļāđāļāļ°āļāđāļāļāļāļđāļāļŦāļĒāļļāļāļāļĒāļđāđāļāļąāđāļ§āļāļāļ°āļāļāļāļ§āđāļēāļāļēāļāļāļĩāđāļĢāđāļāļāļāļāļāļ socket āļāļ°āļŠāļīāđāļāļŠāļļāļāļĨāļ āđāļāđāļāļĒāđāļēāļāđāļĢāļāđāļāļēāļĄāļāđāļŠāļēāļĄāļēāļĢāļāļāļąāđāļāļāđāļēāđāļŦāđ socket āļāļģāļāļēāļāđāļāļ non-blocking āđāļāđāđāļāļĒāļāļēāļĢāđāļāđāļāļąāļāļāđāļāļąāļ fcntl
āļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļŠāļ·āđāļāļŠāļēāļĢāļāđāļēāļ socket āđāļāļĨāļąāļāļĐāļāļ°āļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāđāļāļ connectionless (SOCK_DGRAM) āđāļāļĒāđāļāļĢāļ·āđāļāļāļĨāļđāļ (datagram client) āļāļ°āđāļāļ·āđāļāļĄāļāđāļāđāļāļĒāļąāļāđāļāļĢāļ·āđāļāļāđāļĄāđ (datagram server) āđāļĨāđāļ§āļāļģāļāļēāļĢāļŠāđāļāļāđāļāļāļ§āļēāļĄāđāļāļĒāļąāļāđāļāļĢāļ·āđāļāļāđāļĄāđ āđāļĄāļ·āđāļāđāļāļĢāļ·āđāļāļāđāļĄāđāđāļāđāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļāđāļāļ°āđāļŠāļāļāļāļāļāļāļēāļāļŦāļāđāļēāļāļāļāļāļāļāļąāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
āđāļāļĢāđāļāļĢāļĄāļāļąāđāļāđāļāļĢāļ·āđāļāļāđāļĄāđ (Server):
/*
** dgram_server.c -- a datagram sockets "server"
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define MYPORT 4950 // the port users will be connecting to
#define MAXBUFLEN 100
int main(void) {
int sockfd;
struct sockaddr_in my_addr; // my address information
struct sockaddr_in their_addr; // connector's address information
socklen_t addr_len;
int numbytes;
char buf[MAXBUFLEN];
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}
my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons(MYPORT); // short, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct
if (bind(sockfd, (struct sockaddr*) &my_addr, sizeof(struct sockaddr))
== -1) {
perror("bind");
exit(1);
}
while (strcmp(buf, "close")) {
addr_len = sizeof(struct sockaddr);
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN - 1, 0,
(struct sockaddr*) &their_addr, &addr_len)) == -1) {
perror("recvfrom");
exit(1);
}
printf("got packet from %s\n", inet_ntoa(their_addr.sin_addr));
printf("packet is %d bytes long\n", numbytes);
buf[numbytes] = '\0';
printf("packet from client contains \"%s\"\n", buf);
}
close(sockfd);
return 0;
}
āđāļāļĢāđāļāļĢāļĄāļāļąāđāļāđāļāļĢāļ·āđāļāļāļĨāļđāļ (Client):
/*
** dgram_client.c -- a datagram "client"
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define SERVERPORT 4950 // the port users will be connecting to
#define MAXBUFLEN 100
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in their_addr; // connector's address information
struct hostent *he;
int numbytes, i;
char buf[MAXBUFLEN];
if (argc != 2) {
fprintf(stderr, "usage: ./dgram_client <hostname>\n");
exit(1);
}
if ((he = gethostbyname(argv[1])) == NULL) { // get the host info
perror("gethostbyname");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET; // host byte order
their_addr.sin_port = htons(SERVERPORT); // short, network byte order
their_addr.sin_addr = *((struct in_addr *) he->h_addr);
memset(&(their_addr.sin_zero), '\0', 8); // zero the rest of the struct
while (strcmp(buf, "close")) {
fgets(buf, MAXBUFLEN, stdin);
for (i = 0; buf[i] != '\n'; i++)
;
buf[i] = '\0';
if ((numbytes = sendto(sockfd, buf, strlen(buf), 0,
(struct sockaddr *) &their_addr, sizeof(struct sockaddr)))
== -1) {
perror("sendto");
exit(1);
}
printf("sent %d bytes to %s\n", numbytes,
inet_ntoa(their_addr.sin_addr));
}
close(sockfd);
return 0;
}
āļāļģāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļĨāļ°āļĢāļąāļāđāļāļĢāđāļāļĢāļĄāđāļāļĒāđāļĒāļāļŦāļāđāļēāļāđāļēāļ terminal āļāļąāļāļāļĩāđ
$ gcc -o dgram_server dgram_server.c
$ ./dgram_server
got packet from 127.0.0.1
packet is 20 bytes long
packet from client contains "Hello from Client..."
āļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāđāļāļ·āđāļāļĄāļāđāļāļāđāļēāļāļāđāļāļāđāļāđāļāđāļāļĨāļąāļāļĐāļāļ° connection-oriented (SOCK_STREAM
) āđāļĄāļ·āđāļāļāļģāļāļēāļĢāļŠāļāļēāļāļāļēāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļŠāļģāđāļĢāđāļāđāļāļĒāđāļāļĢāļ·āđāļāļāļĨāļđāļ (client) āļāļ°āđāļāļ·āđāļāļĄāļāđāļāđāļāļĒāļąāļāđāļāļĢāļ·āđāļāļāđāļĄāđ (server) āđāļĨāđāļ§āļāļģāļāļēāļĢāļŠāđāļāļāđāļāļāļ§āļēāļĄāđāļāļĒāļąāļāđāļāļĢāļ·āđāļāļāđāļĄāđ āđāļĄāļ·āđāļāđāļāļĢāļ·āđāļāļāđāļĄāđāđāļāđāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļāđāļāļ°āđāļŠāļāļāļāļāļāļāļēāļāļŦāļāđāļēāļāļāļāļāļāļāļąāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
āđāļāļĢāđāļāļĢāļĄāļāļąāđāļāđāļāļĢāļ·āđāļāļāđāļĄāđ (Server):
/*
** strm_server.c -- a stream sockets "server"
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#define TRUE 1
main() {
int sock, length;
struct sockaddr_in server;
int msgsock;
char buf[1024];
int rval;
int i;
/* Create socket */
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("opening stream socket");
exit(1);
}
/* Name socket using wildcards */
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = 0;
if (bind(sock, (struct sockaddr*) &server, sizeof(server))) {
perror("binding stream socket");
exit(1);
}
/* Find out assigned port number and print it out */
length = sizeof(server);
if (getsockname(sock, (struct sockaddr*) &server, &length)) {
perror("getting socket name");
exit(1);
}
printf("Socket has port #%d\n", ntohs(server.sin_port));
/* Start accepting connections */
listen(sock, 5);
do {
msgsock = accept(sock, 0, 0);
if (msgsock == -1) {
perror("accept");
return EXIT_FAILURE;
} else
do {
memset(buf, 0, sizeof(buf));
if ((rval = read(msgsock, buf, 1024)) < 0)
perror("reading stream message");
else if (rval == 0)
printf("Ending connection\n");
else
printf("-->%s\n", buf);
} while (rval > 0);
close(msgsock);
} while (TRUE);
}
āđāļāļĢāđāļāļĢāļĄāļāļąāđāļāđāļāļĢāļ·āđāļāļāļĨāļđāļ (Client):
/*
** strm_client.c -- a stream sockets "client"
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define DATA "Hello message from Client..."
main(int argc, char *argv[]) {
int sock;
struct sockaddr_in server;
struct hostent *hp,* gethostbyname();
/* Create socket */
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("opening stream socket");
exit(1);
}
/* Connect socket using name specified by command line. */
server.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
if (hp == 0) {
fprintf(stderr, "%s: unknown host\n", argv[1]);
exit(2);
}
memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
server.sin_port = htons(atoi(argv[2]));
if (connect(sock, (struct sockaddr*) &server, sizeof(server)) < 0) {
perror("connecting stream socket");
exit(1);
}
if (write(sock, DATA, sizeof(DATA)) < 0)
perror("writing on stream socket");
close(sock);
}
āļāļģāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļĨāļ°āļĢāļąāļāđāļāļĢāđāļāļĢāļĄāđāļāļĒāđāļĒāļāļŦāļāđāļēāļāđāļēāļ terminal āļāļąāļāļāļĩāđ
$ gcc -o strm_server strm_server.c
$ ./strm_server
Socket has port #37219
--> Hello message from Client...
Ending connection
āļāļēāļāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāļĢāđāļāļĢāļĄāļāđāļēāļāļāđāļ āđāļĄāļ·āđāļāđāļāļĢāđāļāļĢāļĄ strm_server
āđāļĢāļīāđāļĄāļāļģāļāļēāļāļāļāđāļāļĢāļ·āđāļāļāđāļĄāđāđāļĨāđāļ§ āļāļ°āđāļāđāļāļŦāļĄāļēāļĒāđāļĨāļāļāļāļĢāđāļāļāļĩāđāđāļāļīāļāļĢāļāđāļŦāđāđāļāļĢāļ·āđāļāļāļāļ·āđāļāđāļāđāļēāļĄāļēāđāļāļ·āđāļāļĄāļāđāļ āļŦāļĨāļąāļāļāļēāļāļāļąāđāļāđāļĄāļ·āđāļāļĢāļąāļāđāļāļĢāđāļāļĢāļĄ strm_client
āļāļĩāđāļāļĒāļđāđāđāļāļāļąāđāļāļāļāļāđāļāļĢāļ·āđāļāļāļĨāļđāļāđāļāļĒāļĢāļ°āļāļļāļāļēāļĢāđāļāļīāļ§āđāļĄāļāļāđāļāļąāļ§āđāļĢāļāđāļāđāļāļŦāļĄāļēāļĒāđāļĨāļāļāļĩāđāļāļĒāļđāđāļāļāļāđāļāļĢāļ·āđāļāļāđāļĄāđ (127.0.0.1
) āđāļĨāļ°āļāļąāļ§āļāļĩāđāļŠāļāļāđāļāđāļāļŦāļĄāļēāļĒāđāļĨāļāļāļāļĢāđāļāļāļĩāđāļāļđāļāđāļāļīāļāđāļāđāļāļĢāļ·āđāļāļāđāļĄāđ (37219
) āļāļāļāļĢāļ°āļāļąāđāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļĢāļ°āļŦāļ§āđāļēāļāļāļąāđāļāļŠāļāļāđāļāļĢāļ·āđāļāļāļāļđāļāļŠāļāļēāļāļāļēāđāļĢāļĩāļĒāļāļĢāđāļāļĒāđāļĨāđāļ§ āļāđāļāļāļ§āļēāļĄāļāļĩāđāļāļđāļāļāļģāļŦāļāļāđāļ§āđāđāļāđāļāļĢāđāļāļĢāļĄ strm_client āļāđāļāļ°āļāļđāļāļŠāđāļāđāļāļĒāļąāļāđāļāļĢāļ·āđāļāļāđāļĄāđāļāļąāļāđāļāļĄāļąāļāļīāļāļąāļāļāļĨāļĨāļąāļāļāđāļāđāļēāļāļāļ
āļāļąāļāļāđāļāļąāļ accept()
āļ āļēāļĒāđāļāđāļāļĢāđāļāļĢāļĄ strm_server
āļāļ°āļāļđāļāđāļŦāđāļŦāļĒāļļāļāļĢāļāļāļąāļāļāļēāļĢāļĢāđāļāļāļāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļēāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļ āļēāļĒāļāļāļ āļāļķāđāļāļāđāļēāļĒāļąāļāđāļĄāđāļĄāļĩāļāļēāļĢāļĢāđāļāļāļāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļŦāļĢāļ·āļāļāđāļāļĄāļđāļĨāļāļĩāđāļāđāļēāļāđāļāđāļĄāļēāļāļēāļ socket āļĒāļąāļāļĄāļēāđāļĄāđāļāļĢāļ āļ āđāļ§āļĨāļēāļāļąāđāļāļāļąāļ§āđāļāļĢāđāļāļĢāļĄ strm_server
āļāđāļĒāļąāļāļāļāļŦāļĒāļļāļāļĢāļāđāļāļĒāđāļĄāđāļŠāļēāļĄāļēāļĢāļāđāļāļāļģāļāļēāļāļāļĒāđāļēāļāļāļ·āđāļāđāļāđāđāļĨāļĒ
āļāļąāļāļāļąāđāļāđāļāļ·āđāļāđāļŦāđāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāļĢāđāļāļĢāļĄ strm_server
āļāļĨāļēāļĒāđāļāđāļāđāļāļ non-blocking āļāļĨāđāļēāļ§āļāļ·āļāđāļāļĢāđāļāļĢāļĄāļĒāļąāļāļŠāļēāļĄāļēāļĢāļāļāļģāļāļēāļāļāļĒāđāļēāļāļāļ·āđāļāđāļāđāļāļĒāļđāđ āđāļāļĒāļāļĩāđāđāļĄāđāļāđāļāļāļŦāļĒāļļāļāļĢāļāđāļŦāļĄāļ·āļāļāđāļāļĢāđāļāļĢāļĄāļāđāļēāļāļāđāļ āļāđāļ§āļĒāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđāļāļąāļāļāđāļāļąāļ select()
āđāļāļ·āđāļāļāļģāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļ§āđāļēāđāļĄāļ·āđāļāđāļāļāļĩāđāļĄāļĩāļāļēāļĢāļĢāđāļāļāļāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ socket āļāļēāļāđāļāļĢāļ·āđāļāļāļ āļēāļĒāļāļāļ āļāđāļāļ°āļāđāļāļĒāđāļāđāļĢāļĩāļĒāļāļāļąāļāļāđāļāļąāļ accept()
āđāļŦāđāļāļģāļāļēāļāļāļąāļāļāļĩ āļāđāļ§āļĒāļ§āļīāļāļĩāļāļēāļĢāļāļĩāđāđāļāļāļŠāļēāļĄāļēāļĢāļāļāļĢāļ°āļĒāļļāļāļāđāđāļŦāđāđāļāļĢāđāļāļĢāļĄāļāļāđāļāļĢāļ·āđāļāļāđāļĄāđ āļŠāļēāļĄāļēāļĢāļāđāļāļīāļāļĢāļąāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāđāļāđāļĄāļēāļāļāļ§āđāļēāļŦāļāļķāđāļ socket āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄ new_strm_server.c
āļāļĩāđāļāļĢāļąāļāļāļĢāļļāļāđāļŦāļĄāđāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
/*
** new_strm_server.c -- a stream sockets "server"
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#define TRUE 1
/*
* This program uses select() to check that someone
* is trying to connect before calling accept().
*/
main() {
int sock, length;
struct sockaddr_in server;
int msgsock;
char buf[1024];
int rval;
fd_set ready;
struct timeval to;
/* Create socket */
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("opening stream socket");
exit(1);
}
/* Name socket using wildcards */
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = 0;
if (bind(sock, (struct sockaddr*) &server, sizeof(server))) {
perror("binding stream socket");
exit(1);
}
/* Find out assigned port number and print it out */
length = sizeof(server);
if (getsockname(sock, (struct sockaddr*) &server, &length)) {
perror("getting socket name");
exit(1);
}
printf("Socket has port #%d\n", ntohs(server.sin_port));
/* Start accepting connections */
listen(sock, 5);
do {
FD_ZERO(&ready);
FD_SET(sock, &ready);
to.tv_sec = 5;
if (select(sock + 1, &ready, 0, 0, &to) < 0) {
perror("select");
return EXIT_FAILURE;
}
if (FD_ISSET(sock, &ready)) {
msgsock = accept(sock, (struct sockaddr*) 0, (int*) 0);
if (msgsock == -1) {
perror("accept");
return EXIT_FAILURE;
} else
do {
memset(buf, 0, sizeof(buf));
if ((rval = read(msgsock, buf, sizeof(buf))) < 0)
perror("reading stream message");
else if (rval == 0)
printf("Ending connection\n");
else
printf("-->%s\n", buf);
} while (rval > 0);
close(msgsock);
} else
printf("Do something else...\n");
} while (TRUE);
}
āļāļģāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļĨāļ°āļĢāļąāļāđāļāļĢāđāļāļĢāļĄāļāļĩāļāļāļĢāļąāđāļāđāļāļĒāđāļĒāļāļŦāļāđāļēāļāđāļēāļ terminal āļāļąāļāļāļĩāđ
$ gcc -o new_strm_server new_strm_server.c
$ ./new_strm_server
Socket has port #45480
--> Hello message from Client...
Ending connection
Do something else
Do something else
Do something else
Last updated
Was this helpful?