Socket Programming

BSD Sockets

āļ›āļĢāļ°āđ€āļ āļ—āļāļēāļĢāļāļĨāđ„āļāļŠāļ·āđˆāļ­āļŠāļēāļĢ IPC

āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ 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 āļˆāļ°āļ–āļđāļāļĢāļ°āļšāļļāđƒāļŦāđ‰āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŦāļĢāļ·āļ­āđ‚āļ”āđ€āļĄāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™

āļŠāļ·āđˆāļ­āđ‚āļ”āđ€āļĄāļ™āļŠāļģāļŦāļĢāļąāļš socket āļĄāļĩāļ­āļĒāļđāđˆāļŦāļĨāļēāļĒāđāļšāļš āđāļ•āđˆāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļĢāļđāđ‰āļˆāļąāļāđāļĨāļ°āļ™āļīāļĒāļĄāļāđ‡āļĄāļĩāļ­āļĒāļđāđˆ 2 āļ›āļĢāļ°āđ€āļ āļ—āļ„āļ·āļ­ UNIX domain (AF_UNIX) āđāļĨāļ° Internet domain (AF_INET)

āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļģāļ‡āļēāļ™āđāļĒāļāļāļąāļ™āļ­āļĒāļđāđˆāļ„āļ™āļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļ‹āļķāđˆāļ‡āļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļĒāļđāđˆāļšāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ— (TCP/IP) āļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™ āđāļ•āđˆāļĨāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŠāļ·āđˆāļ­āļŠāļģāļŦāļĢāļąāļš socket āļ‚āļķāđ‰āļ™āļĄāļēāļ āļēāļĒāđƒāļ™ Internet domain āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļ‹āļķāđˆāļ‡āļ–āļđāļāļžāļąāļ’āļ™āļēāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļĄāļēāļ•āļĢāļēāļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ—āļĩāđˆāļ–āļđāļāļāļģāļŦāļ™āļ”āđ‚āļ”āļĒāļŦāļ™āđˆāļ§āļĒāļ‡āļēāļ™ DAPRA āđ„āļ”āđ‰āđāļāđˆ IP, TCP āđāļĨāļ° UDP āđ‚āļ”āļĒāļ—āļĩāđˆāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ—āļĩāđˆāļ­āļĒāļđāđˆ (address) āđƒāļ™ Internet domain āļ™āļąāđ‰āļ™āļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļ—āļĩāđˆāļ­āļĒāļđāđˆāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ (machine network address) āđāļĨāļ° āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ• (port address)

Socket āļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļāļąāļ™ 3 āļ›āļĢāļ°āđ€āļ āļ—āđ‚āļ”āļĒāļĒāļķāļ”āļ•āļēāļĄāļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ TCP/IP āđ„āļ”āđ‰āđāļāđˆ

Socket
āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ

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

āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļ”āļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļĨāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āļ‚āļ­āļ‡ TCP/IP

āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™ socket āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚ IP address āđāļ•āđˆāļĨāļ°āļ•āļąāļ§ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (network ID) āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ (host ID) āđāļĨāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚ netmask address

āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ, socket, protocol āđāļĨāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ•āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļāļąāļ™ āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļĢāļđāđ‰āđ„āļ”āđ‰āđāļāđˆ

  • āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļ™āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļīāļ”āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ āļēāļĒāļ™āļ­āļāđ„āļ”āđ‰āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āđƒāļ™āđ€āļ§āļĨāļēāđ€āļ”āļĩāļĒāļ§āļāļąāļ™

  • āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĨāļēāļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđƒāļ™āđ€āļ§āļĨāļēāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđāļ•āđˆāđ„āļĄāđˆāļ„āđˆāļ­āļĒāļžāļšāđ€āļŦāđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ™āļĩāđ‰

  • āļĄāļēāļāļāļ§āđˆāļēāļŦāļ™āļķāđˆāļ‡āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļąāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™

  • āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ—āļąāđ‰āļ‡ TCP āđāļĨāļ° UDP āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļĨāļ°āļĢāļąāļšāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ

āļ•āļēāļĄāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ„āļ› āđ€āļŠāđˆāļ™ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ™āđ‰āļ™āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āđāļĄāđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļŦāļēāļĒāđ„āļ”āđ‰āļšāđ‰āļēāļ‡āļāđ‡āļˆāļ°āđƒāļŠāđ‰āļŠāđˆāļ­āļ‡āļ—āļēāļ‡ UDP āļŦāļĢāļ·āļ­āļ–āđ‰āļēāđ€āļ™āđ‰āļ™āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļ—āļĩāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļ•āđ‰āļ­āļ‡āđ„āļĄāđˆāļŠāļđāļāļŦāļēāļĒāļāđ‡āļˆāļ°āđƒāļŠāđ‰āļŠāđˆāļ­āļ‡āļ—āļēāļ‡ TCP āđƒāļ™āļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āđāļ—āļ™

  • āđ„āļŸāļĨāđŒ /etc/services āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āļšāļ­āļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāđāļĨāļ°āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļ—āļĩāđˆāđƒāļŠāđ‰āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™āļ‹āđ‡āļīāļ­āļāđ€āļāđ‡āļ•āđƒāļ™āļĢāļ°āļ”āļąāļšāļ‚āļ­āļ‡ Transport layer

āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļœāđˆāļēāļ™ Socket

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđāļĨāļ°āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

  • āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ„āļ·āļ­ sys/types.h,sys/socket.h,unistd.h,netinet/in.hāđāļĨāļ°sys/un.h

  • āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāļŠāļģāļ„āļąāļ

    • āļ•āļąāļ§āđāļ›āļĢ struct sockaddr āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļļāļ‚āđ‰āļ­āļĄāļđāļĨāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āđ‚āļ”āđ€āļĄāļ™āļ—āļąāđ‰āļ‡ AF_UNIX āđāļĨāļ° AF_INET

    • āļ•āļąāļ§āđāļ›āļĢ struct sockaddr_in āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļļāļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°āļ‚āļ­āļ‡ socket āđƒāļ™ Internet domain āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰

struct sockaddr {
	unsigned short sa_family;    // address family, AF_xxx
	char sa_data[14];  // 14 bytes of protocol address
};

struct sockaddr_in {
	u_char sin_len;
	u_char sin_family; /* = AF_INET */
	u_short sin_port; /* use htons() to set this */
	struct in_addr sin_addr;
	char sin_zero[8]; /* 8 zeros required here */
};

struct in_addr {
	in_addr_t s_addr;
/* either use a macro from netinet/in.h (eg INADDR_ANY), or inet_addr */
};

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ int socket(int domain, int communication_type, int protocol);

    • āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļŠāļĢāđ‰āļēāļ‡ socket āđ‚āļ”āļĒāļĢāļ°āļšāļļāđ‚āļ”āđ€āļĄāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ (domain) āđ€āļŠāđˆāļ™ AF_INET āđāļĨāļ°āļĢāļ°āļšāļļāļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ (communication_type) āđ€āļŠāđˆāļ™ SOCK_STREAM āđ‚āļ”āļĒāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļāđ‡āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļŠāļ™āļīāļ”āļ‚āļ­āļ‡āđ‚āļ”āđ€āļĄāļ™

āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļœāđˆāļēāļ™ socket āļ™āļąāđ‰āļ™āđāļšāđˆāļ‡āļ­āļ­āļāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 2 āļ›āļĢāļ°āđ€āļ āļ—āđ„āļ”āđ‰āđāļāđˆ

  1. āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāļĄāļĩāļāļēāļĢāļŠāļ–āļēāļ›āļ™āļēāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ (connection-oriented āļŦāļĢāļ·āļ­ connectionful) āļŦāļĄāļēāļĒāļ–āļķāļ‡āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļĄāļĩāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļŠāļ–āļēāļ›āļ™āļēāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđƒāļŦāđ‰āđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāļāđˆāļ­āļ™ (point-to-point) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™āļ—āđˆāļ­āļ™āļĩāđ‰āļĄāļĩāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ„āļĢāļšāļ–āđ‰āļ§āļ™āđāļĨāļ°āļĄāļĩāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ” āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ„āļĢāđˆāļēāļ§āđ†āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰

    • āļŠāļĢāđ‰āļēāļ‡ socket āđāļĨāļ°āļĢāļ°āļšāļļāđ‚āļ”āđ€āļĄāļ™ -- socket()

    • āļ—āļģāļāļēāļĢāļœāļđāļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡ socket āđāļĨāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ• -- bind()

    • āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āđ€āļžāļ·āđˆāļ­āļĢāļ­āļāļēāļĢāļ‚āļ­āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļˆāļēāļāļ āļēāļĒāļ™āļ­āļ -- listen()

    • āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāđ‡āļˆāļ°āļ•āļ­āļšāļĢāļąāļšāđāļĨāļ°āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ–āļēāļ›āļ™āļēāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™ -- accept()

    • āđ€āļĢāļīāđˆāļĄāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™ -- write() and read()

    • āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ -- close()

  2. āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļŠāļ–āļēāļ›āļ™āļēāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ (connectionless) āļŦāļĄāļēāļĒāļ–āļķāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāļēāļĄāļēāļĢāļ–āļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļ­āļāđ„āļ›āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāđ‚āļ”āļĒāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļŠāļ–āļēāļ›āļ™āļēāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđƒāļ” āļ™āļąāļāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļŦāļēāļ§āļīāļ˜āļĩāļāļēāļĢāđ€āļ—āļ„āļ™āļīāļ„āļ•āđˆāļēāļ‡āđ†āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ”āđ‰āļ§āļĒāļ•āļąāļ§āđ€āļ­āļ‡ āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ„āļĢāđˆāļēāļ§āđ†āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰

    • āļŠāļĢāđ‰āļēāļ‡ socket āđāļĨāļ°āļĢāļ°āļšāļļāđ‚āļ”āđ€āļĄāļ™ -- socket()

    • āļ—āļģāļāļēāļĢāļœāļđāļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡ socket āđāļĨāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ• -- bind()

    • āđ€āļĢāļīāđˆāļĄāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ -- sendto() and recvfrom()

    • āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ -- close()

āđ‚āļ”āļĒāļ„āđˆāļēāļ›āļĢāļīāļĒāļēāļĒāđāļĨāđ‰āļ§āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ sockets āļˆāļ°āđ€āļ›āđ‡āļ™āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āđāļšāļšāļ–āļđāļāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļŦāļĒāļļāļ”āļĢāļ­ (blocking) āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ•āđˆāļēāļ‡āđ†āļˆāļ°āļ•āđ‰āļ­āļ‡āļ–āļđāļāļŦāļĒāļļāļ”āļ­āļĒāļđāđˆāļŠāļąāđˆāļ§āļ‚āļ“āļ°āļˆāļ™āļāļ§āđˆāļēāļ‡āļēāļ™āļ—āļĩāđˆāļĢāđ‰āļ­āļ‡āļ‚āļ­āļšāļ™ socket āļˆāļ°āļŠāļīāđ‰āļ™āļŠāļļāļ”āļĨāļ‡ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰ socket āļ—āļģāļ‡āļēāļ™āđāļšāļš non-blocking āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ fcntl

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 1

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™ 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..."

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 2

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļœāđˆāļēāļ™āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āđƒāļ™āļĨāļąāļāļĐāļ“āļ° 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?