Advance Innovation Centre
  • AIC Knowledge @ EEC for All
  • 😎Logical Thinking
    • Karel Robot
    • Code to Flowchart
    • Play with Docker
    • CNX Software
  • MCU & Interfacing with Infineon PSOCâ„Ē
    • Basic MCU Interfacing
      • Introduction to CY8CKIT-062S2-43012 Pioneer Kit
      • Development Environment Preparation
      • PSoCâ„Ē 6S2 Peripherals Interfacing (GPIO)
        • Hello World and LED Blinking
        • GPIO Principles
        • PSoCâ„Ē 6S2 GPIO-HAL LED Blink Lab
        • PSoCâ„Ē 6S2 GPIO-PDL LED Blink Lab
        • Button "Bounce" Principles
          • Push/Pull Button to Turn ON/OFF LED via HAL
          • Push/Pull Button to Turn ON/OFF LED via PDL
          • GPIO Button Interrupt via HAL
          • GPIO Button Interrupt via PDL
        • GPIO variables & functions
      • PSoCâ„Ē 6S2 Peripherals Interfacing (ADC, PWM)
        • PSoCâ„Ē 6S2 SAR ADC
          • ADC Principles
          • PSoCâ„Ē 6S2 with ADC Labs
            • Reading potentiometer sensor value via an ADC HAL
            • Reading potentiometer sensor value via an ADC PDL
        • PSoCâ„Ē 6S2 PWM & TCPWM
          • PWM Principles
          • PSoCâ„Ē 6S2 for PMW Function Labs
            • LED Brightness using PWM via HAL
            • LED Brightness using PWM via PDL
    • Sensor Interfacing and HMI
      • OLED Display
        • OLED Display Principles
        • Calling BDH’s OLED functions
        • Display ADC via Potentiometer on OLED
      • BDH Shell
        • Shell Principles
        • LED Blinking and CAPSENSE via BDH Shell
        • Adding "History" command
        • Adding "Reboot" command
        • CAPSENSE Button and Slider
          • CAPSENSE Button and Slider with Capsense Tuner
          • CAPSENSE Button and Slider using FreeRTOS
    • Serial Communication & Visualization
      • UART, I2C, SPI Communication via Infineon PSoCâ„Ē6
      • BMX160 Sensor Communication via Infineon PSoCâ„Ē6
        • Reading ADC via HAL with Potentiometer and Displaying GUI on Serial Studio
        • Reading XENSIV-DPS-3XX Pressure Sensor and Displaying GUI on Serial Studio
        • Motion Sensors GUI Integration via Serial Studio
    • IoT Connectivity & Data Analytics via Node-Red
      • Node-Red Installation
      • Setting MQTTS to MQTT Broker
      • Sending PSoC6’s sensor to MQTT (node-red)
    • Edge AI on PSoCâ„Ē
      • Machine Learning on PSoCâ„Ē6 via Edge-Impulse
    • Infineon PSoCâ„Ē Troubleshooting
  • IoT Development with Infineon PSOCâ„Ē & BDH Platform
    • PSoCâ„Ē IoT Development Kit
      • Introduction to CY8CKIT-062S2-43012 Pioneer Kit
      • Development Environment Preparation
        • Hello World and LED Blinking
    • IoT Connectivity
      • Node-Red Installation
      • Controlling PSoCâ„Ē LED using MQTT
      • Setting MQTTS to MQTT Broker
      • Sending PSoC6’s sensor to MQTT (node-red)
    • BDH IoT Connectivity
    • WireLinXâ„Ē IoT PLC
    • BDH X-Brain Data Analytics
      • PSoC6 Data Collection to CSV log file
    • Data Visualization
      • āļŠāļĢāđ‰āļēāļ‡ Dashboard āļ”āđ‰āļ§āļĒ Looker Studio
  • ðŸ–ĨïļOperation Systems
    • Prerequisites
      • Guideline from Ubuntu
        • Ubuntu and VSCode on WSL2
      • āļ•āļīāļ”āļ•āļąāđ‰āļ‡ WSL 2
      • Run Ubuntu on VirtualBox7
    • Zero to Linux Hero
      • Computer OS Architecture
      • Anatomy of Linux System
        • UNIX/Linux History
        • UNIX/Linux Evolution
        • GNU Project
        • Linux OS Architecture
        • Command Line Interface (CLI)
          • Basic Commands
          • 😎Level up your Linux Shell
          • File & Dir. Commands
          • Searching Commands
          • 😎ChatGPT-based Terminal
          • SysAdmin Commands
          • Network Commands
          • Hacker Commands
        • Busybox
        • Shell Script
          • Awk Script
          • Bash Shell Script
            • Bash Snippets
            • Bash Useful Examples
      • Anatomy of Linux Kernel
        • Linux Kernel Principles
        • Linux Environment for Developer
      • Anatomy of Embedded Linux
        • Embedded Linux
        • Host & Target
        • Cross Toolchains
        • Bootloader
        • Building Embedded Linux
    • Linux OS Dev. Engineer
      • Process Management
        • Process Basic
        • Process State
        • Basic Process Mgmt. Commands
        • Advance Process Mgmt. Commands
        • Process API Programming
      • IPC
        • IPC Anatomy
        • Signal Programming
        • Pipe Programming
        • FIFO Programming
        • Msg. Queue Programming
          • System V
        • Share Memory Programming
          • System V
        • Socket Programming
      • POSIX Threads
        • Multi-tasking Basic
        • POSIX Thread Anatomy
        • Threading Programming
      • Applied IPC
        • Remote Commander
        • Multi-Remote Commanders
      • Process Synchronization
        • Mutex Programming
        • Semaphore Programming
      • Applied IPC with Semaphore
  • ⌚Embedded Systems Development
    • Introduction to ESD
      • Why's ESD?
      • What it use for?
      • How it works?
    • Enbedded System Development via PSoC6
      • Basic MCU Interfacing
        • Introduction to CY8CKIT-062S2-43012 Pioneer Kit
        • Development Environment Preparation
        • PSoCâ„Ē 6S2 Peripherals Interfacing (GPIO)
          • Hello World and LED Blinking
          • GPIO Principles
          • PSoCâ„Ē 6S2 GPIO-HAL LED Blink Lab
          • PSoCâ„Ē 6S2 GPIO-PDL LED Blink Lab
          • Button "Bounce" Principles
            • Push/Pull Button to Turn ON/OFF LED via HAL
            • Push/Pull Button to Turn ON/OFF LED via PDL
            • GPIO Button Interrupt via HAL
            • GPIO Button Interrupt via PDL
          • GPIO variables & functions
        • PSoCâ„Ē 6S2 Peripherals Interfacing (ADC, PWM)
          • PSoCâ„Ē 6S2 SAR ADC
            • ADC Principles
            • PSoCâ„Ē 6S2 with ADC Labs
              • Reading potentiometer sensor value via an ADC HAL
              • Reading potentiometer sensor value via an ADC PDL
          • PSoCâ„Ē 6S2 PWM & TCPWM
            • PWM Principles
            • PSoCâ„Ē 6S2 for PMW Function Labs
              • LED Brightness using PWM via HAL
              • LED Brightness using PWM via PDL
      • Sensor Interfacing and HMI
        • OLED Display
          • OLED Display Principles
          • Calling BDH’s OLED functions
          • Display ADC via Potentiometer on OLED
        • BDH Shell
          • Shell Principles
          • LED Blinking and CAPSENSE via BDH Shell
          • Adding "History" command
          • Adding "Reboot" command
          • CAPSENSE Button and Slider
            • CAPSENSE Button and Slider with Capsense Tuner
            • CAPSENSE Button and Slider using FreeRTOS
      • Serial Communication & Visualization
        • UART, I2C, SPI Communication via Infineon PSoCâ„Ē6
        • BMX160 Sensor Communication via Infineon PSoCâ„Ē6
          • Reading ADC via HAL with Potentiometer and Displaying GUI on Serial Studio
          • Reading XENSIV-DPS-3XX Pressure Sensor and Displaying GUI on Serial Studio
          • Motion Sensors GUI Integration via Serial Studio
    • Edge Computing and IoT Connectivity
    • Cloud-Based Data Analytics and Digital Twin
    • Edge Vision AI
    • Resources
      • Basic Hardware and Firmware
        • Environment Preparation
          • āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Arduino IDE
            • āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļŠāđ‰āļ‡āļēāļ™ Arduino IDE
          • āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ§āļąāļ” NI MyDAQ
            • āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŠāđ‰ Digital Multimeter -NI ELVISmx
            • āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŠāđ‰ Oscilloscope-NI ELVISmx
          • āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ KingstVIS
        • Basic measurement
          • Basic Digital and Analog I/O
            • LAB: Basic Digital Input/Output
            • LAB: Basic Analog Input/Output
          • Waveform
            • LAB: Oscilloscope
            • LAB: Oscilloscope and Function Generator
            • LAB: Pulse Width Modulation (PWM)
              • Homework
        • Interfacing and Communication
          • LAB: UART, RS485, RS232 Protocol
          • LAB: I2C Protocol
            • HOMEWORK
          • LAB: SPI Protocol
      • IoT Connectivity
        • Example: IoT with MQTT on Node-red
        • Data logger
        • LAB: Data Visualization
  • 🛠ïļC/C++ for Embedded Programming
    • Development Environment Preparation
      • āļ•āļīāļ”āļ•āļąāđ‰āļ‡ WSL 2
      • āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Ubuntu environment
      • āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Visual Studio Code
      • āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ Virtual studio code āđ€āļ‚āđ‰āļēāļāļąāļš WSL
      • āļ•āļīāļ”āļ•āļąāđ‰āļ‡ docker on WSL
    • Principle C/C++ Programming
      • Get started with C++
      • Makefile
        • Makefile Examples
      • Compiling and running
        • How to create a program that you can enter inputs.
          • Lab 1 Exercise
      • Arguments
        • Command line arguments in C and C++
      • signed and unsigned data types
      • Variable and Operator
      • If and If else
      • Loop, Infinite loop, and flag
        • Loop and Flag exercise
      • Array
        • Get to know with arrays
        • Implement example
      • Vector
    • Object Oriented Programming (OOP) in C++
      • Class and Object
      • Encapsulation and Abstraction
      • Polymorphism and Inheritance
    • C/C++ Preprocessing
      • Macro
        • Quiz Macro
      • File Inclusion
      • Conditional Compilation
      • Pragma directive
        • Quiz Pragma
    • String in C++
      • Concatenation
      • Split
    • Type conversions for C/C++
      • Conversion using Cast operator
    • Error handling
    • Data logger
      • āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āđ„āļŸāļĨāđŒ
      • āļāļēāļĢāļ­āđˆāļēāļ™āđ„āļŸāļĨāđŒ
      • āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļāļąāļšTime stamp
    • High performance programing
      • Multi-task and Multi-thread
        • Multi-threading example
      • Mutex
      • Queue
      • OpenCV
    • C/C++ Techniques
      • Makefile in action
      • Object Oriented Programming (OOP) in C++
        • Class and Object
        • Encapsulation and Abstraction
        • Polymorphism and Inheritance
      • C/C++ Preprocessing
        • Macro
          • Quiz Macro
        • File Inclusion
        • Conditional Compilation
        • Pragma directive
          • Quiz Pragma
      • Binary, Octal and Hexadecimal Numbers
      • Array and properties of an array
        • Get to know with arrays
        • Implement example
      • What's next?
  • ðŸĪ–Artificial Intelligence (AI)
    • VAMStack Design House, BUU
    • Data Analytics
      • Data cleansing
      • Data analytics
      • Data analytic exercise
    • Machine Learning
      • Neural Network Layers
      • Machine learning type
      • Dataset
      • Using Edge Impulse for AI Model
    • Basic Image Processing
      • Computer Vision using Python Language
        • Installation
        • Computer Vision Basics
          • Pixel and Color
          • Draw image
          • Basic Image processing
          • Morphology Transformations
          • Gaussian blur
          • Simple Thresholding
          • Contour
          • Canny edge detection
        • Case Study
          • Coin counting
          • Color detection & tracking
        • VAM_CV SDK
  • ⚙ïļFPGA Design and Development
    • Verilog HDL via Vivado IDE
      • LAB1: Setting Environment and Create Project
        • Create Vivado Project
      • LAB2: Hardware Description Language Work Flow
        • Simulation code
      • LAB3: Design HDL Project
        • Top Level Design
        • Top-level Simulation
      • LAB4: Asynchronous VS Synchronous Circuit
        • Simulation Synchronous counter
    • C/C++ Programming on Ultra96v2 FPGA Board
      • Application C/C++ on Ultra96v2 Part 1
        • Design Overview
        • Step 1 - Burn the image to SD card
        • Step 2 - Bring up Ultra96v2
        • Step 3 - Installing the Vitis-AI runtime packages
      • Application C/C++ on Ultra96v2 Part 2
        • STEP 1 : Setting auto boot Wifi
        • STEP 2 : How to working on Embedded
        • STEP 3 : How to run the test code
  • ðŸĪ–Robotics
    • Dobot Magician
      • Instruction of Dobot
      • Software Download
      • Basically of Program
        • Teaching and Playback
        • Write and Draw
        • LaserEngraving
        • 3D Printer
    • Robotino
      • Software Download
        • Robotino View
        • Robotino SIM
      • Charging
      • Connecting
      • Follow Line example
        • Basic block in Follow Line
    • RaspBlock
      • Get Started with Raspblock
  • ðŸšĐSpecial Topics
    • Node-Red
      • Set up Raspberry Pi
      • Install node red in Raspberry Pi
      • Get started with Node Red
        • Open node-red
        • Turn off node red
        • Install Dashboard on Node-red
        • Use node red to show message
        • Using Ultrasonic sensor with node-red
    • IoT Cloud
      • Overview
        • How do they work?
          • Basic Knowlege
      • Installations
        • Install Docker
        • Install Mosquitto Broker
        • Install InfluxDB
        • Install Telegraf
        • Install Grafana
      • Get Sensor Value and Send to MQTT
        • Connect ESP3266 to sensor
        • Connect ESP3266 to MQTT
      • Integration
    • Senses IoT
      • SENSES IoT Platform
      • LAB8: MCU send data to IoT platform
    • CrowPi Dev Kit
      • Raspberry Pi with CrowPi
      • Remote to Raspberry Pi
      • Cross-Compile
        • Lab 1: Programming and cross complier
      • Hardware and Interfaces Usage CLI
        • LAB: Usage GPIO via CLI
        • LAB: Scan I2C bus via CLI
      • Python library for Crow Pi
      • wiringPi library (C) for CrowPi
        • Lab2: Crowpi and sensors
    • LVGL Development
      • LVGL - Light and Versatile Embedded Graphics Library
        • Setting program for LVGL Simulator
        • Get started with LVGL simulator
        • Example Library of LVGL
        • Create your own screen
          • Exercise
        • Style
          • Exercise
        • Event
    • Docker OS
      • Docker OS Part 1
        • Part 1 : Installation
        • Part 2 : Basic Docker OS and Linux CLI
      • Docker OS Part 2
        • Part 1 : Docker communication
        • Part 2 : Docker compose
      • Application Gstreamer on devcontainer
        • STEP 1 : Setting gstreamer environment
        • STEP 2 : Create the Gstreamer element on template
        • STEP 3 : Testing and application on your gst element
  • ðŸĪŸRecommended by AIC
    • Skill Roadmap
      • Embedded Engineer
      • Developer
    • Hardware Programming
    • Embedded Programming
    • General-propose Programming
    • Algorithmica
    • Thai Expert Knowledge
    • RT-Thread University Program
      • Infineon PSoC6
      • Kernel
        • Kernel Basics
        • Thread Management
        • Clock Management
        • Inter-thread synchronization
        • Inter-thread communication
        • Memory Management
        • Interrupt Management
        • Kernel porting
        • Atomic Operations
        • RT-Thread SMP
        • Kernel API Changelog
      • Tools
      • Devices & Drivers
        • SENSOR Devices
        • Touch Equipment
        • CRYPTO Devices
        • AUDIO Devices
        • Pulse Encoder Devices
      • Components
        • C Library (libc)
        • ISO/ANSI C Standard
        • POSIX Standard
          • FILE (File IO)
          • Pthread
          • Timer
          • IPC Semaphore
          • IPC Message Queues
          • Dynamic Modules
        • Network Components
          • FinSH Console
          • FAL: Flash Abstraction Layer
          • Virtual File System
          • tmpfs: temporary file system
          • ulog log
          • utest testing framework
          • Power Management
          • RT-Link
        • Software Packages
          • Internet of Things
            • MQTT-umqtt
            • Telnet
          • Tools
            • SystemView
            • SEGGER_RTT
          • LVGL Manual
            • Touch Screen Driver
      • Demo
        • Infineon Gateway
        • Handwriting Recognition (MNIST)
        • Object Detection (Darknet)
        • ROS using RT-Thread
        • Control the car using RT-Thread
        • LiDAR via RT-Thread
        • Detection via RT-Thread and ROS
        • Sensor Driver Development Guide
Powered by GitBook

Assoc. Prof. Wiroon Sriborrirux, Founder of Advance Innovation Center (AIC) and Bangsaen Design House (BDH), Electrical Engineering Department, Faculty of Engineering, Burapha University

On this page
  • Socket āļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļāļąāļ™ 3 āļ›āļĢāļ°āđ€āļ āļ—āđ‚āļ”āļĒāļĒāļķāļ”āļ•āļēāļĄāļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ TCP/IP āđ„āļ”āđ‰āđāļāđˆ
  • āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļœāđˆāļēāļ™ socket āļ™āļąāđ‰āļ™āđāļšāđˆāļ‡āļ­āļ­āļāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 2 āļ›āļĢāļ°āđ€āļ āļ—āđ„āļ”āđ‰āđāļāđˆ

Was this helpful?

  1. Operation Systems
  2. Linux OS Dev. Engineer
  3. IPC

Socket Programming

BSD Sockets

PreviousSystem VNextPOSIX Threads

Last updated 1 year ago

Was this helpful?

āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ 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

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

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

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

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

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

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

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

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

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

  • āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ„āļ·āļ­ 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..."
$ gcc -o dgram_client dgram_client.c
$ ./dgram_client 127.0.0.1
Hello from Client...    
sent 20 bytes to 127.0.0.1

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 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
$ gcc -o strm_client strm_client.c
$ ./strm_client 127.0.0.1 37219

āļˆāļēāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄ 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
$ ./strm_client 127.0.0.1 45480

ðŸ–Ĩïļ
āļ›āļĢāļ°āđ€āļ āļ—āļāļēāļĢāļāļĨāđ„āļāļŠāļ·āđˆāļ­āļŠāļēāļĢ IPC
āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļ”āļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļĨāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āļ‚āļ­āļ‡ TCP/IP
āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļœāđˆāļēāļ™ Socket