Hướng dẫn socket trong linux la gi - socket trong linux the gi

1. Giới thiệu về mô hình client/server

- Là mô hình phổ biến cho giao tiếp giữa 2 tiến trình/2 máy, trong đó, tiến trình client kết nối đến tiến trình server để yêu cầu trao đổi dữ liệu.

- Client cần biết về sự tồn tại và địa chỉ của tiến trình server, nhưng server không cần biết về sự tồn tại và địa chỉ của client cho đến khi kết nối

được thiết lập.

- Mỗi khi kết nối được thiết lập, cả 2 bên đều có thể trao đổi (gửi và nhận dữ liệu).khi kết nối được thiết lập, cả 2 bên đều có thể trao đổi (gửi và nhận dữ liệu).

- Để thiết lập một kết nối cho cả 2 phía, cần xây dựng một socket. Có thể hiểu socket như một điểm đầu cuối của kênh kết nối giữa 2 tiến trình. 

(Giống như là thực hiện một kết nối giữa 2 người trong một cuộc gọi điện thoại)

- Các hệ thống (linux, windows) đều cung cấp các hàm hệ thống để thực hiện thiết lập một socket.

2. Các loại socket 

Có 2 loại socket được sử dụng rộng rãi là: stream sockets và datagram sockets.

- Stream sockets: Dựa trên giao thức TCP (Tranmission Control Protocol), là giao thức hướng luồng (stream oriented). Việc truyền dữ liệu chỉ

thực hiện giữa 2 tiến trình đã thiết lập kết nối. Giao thức này đảm bảo dữ liệu được truyền đến nơi nhận một cách đáng tin cậy, đúng thứ tự đã thiết lập kết nối. Giao thức này đảm bảo dữ liệu được truyền đến nơi nhận một cách đáng tin cậy, đúng thứ tự

nhờ vào cơ chế quản lý luồng lưu thông trên mạng và cơ chế chống tắc nghẽn.

- Datagram sockets: Dựa trên giao thức UDP (User Datagram Protocol), là giao thức hướng thông điệp (message oriented). Việc truyền dữ

liệu không yêu cầu có sự thiết lập kết nối giữa tiến quá trình. Ngược lại với giao thức TCP thì dữ liệu được truyền theo giao thức UDP không yêu cầu có sự thiết lập kết nối giữa tiến quá trình. Ngược lại với giao thức TCP thì dữ liệu được truyền theo giao thức UDP

không được tin cậy, có thế không đúng trình tự và lặp lại. Tuy nhiên vì nó không yêu cầu thiết lập kết nối không phải có những cơ chế phức tạp

nên tốc độ nhanh…ứng dụng cho các ứng dụng truyền dữ liệu nhanh như chat, game…..

3. Minh họa lập trình socket 

Bài viết này minh họa lập trình socket trên linux sử dụng trực tiếp các hàm socket api bằng ngôn ngữ C.Mô hình lập trình socket TCP giữa 2 tiến trình client và server như sau:

Mô hình lập trình socket TCP giữa 2 tiến trình client và server như sau:

Hướng dẫn socket trong linux la gi - socket trong linux the gi

- Các bước thiết lập một socket phía client gồm:

+ Tạo một socket bằng hàm socket()socket()

+ Kết nối socket đến địa chỉ của server bằng hàm connect()connect()

+ Gửi và nhận dữ liệu: Có một số cách khác nhau, đơn giản nhất là sử dụng các hàm read() và write() + Đóng kết nối bằng hàm close()read()write() + Đóng kết nối bằng hàm close()

- Các bước thiết lập một socket phía server gồm:

+ Tạo một socket bằng hàm socket()socket()

+ Kết nối socket đến địa chỉ của server bằng hàm connect()bind()

+ Gửi và nhận dữ liệu: Có một số cách khác nhau, đơn giản nhất là sử dụng các hàm read() và write() + Đóng kết nối bằng hàm close()

- Các bước thiết lập một socket phía server gồm:listen()

+ Gắn (bind) socket đến địa chỉ của server sử dụng hàm bind(). accept(). Hàm này sẽ dừng (block) cho đến khi nhận được một client kết nối đến.

Đối với server trên internet địa chỉ bao gồm địa chỉ ip của máy host + số hiệu cổng dịch vụ (port number) read(), write())

+ Lắng nghe (listen) các kết nối đến từ clients sử dụng hàm listen()close()


+ Chấp nhận các kết nối sử dụng hàm accept(). Hàm này sẽ dừng (block) cho đến khi nhận được một client kết nối đến.

  • server.c
  • client.c

+ Gửi và nhận dữ liệu với client (hàm read(), write())

+ Đóng kết nối bằng hàm close()portnumber

Dưới đây là chương trình minh họa lập trình socket TCP sử dụng socket api và pure C. Mã nguồn tham khảo gồm 2 chương trình:server_address portnumber

Biên dịch và chạy 2 chương trình này (trên cùng một máy local host, hoặc 2 máy riêng biệt kết nối mạng)

- Với server:  server portnumber

- Với client:  client server_addressportnumber

/* A simple server in the internet domain using TCP

   The port number is passed as an argument */

#include

#include

#include

#include

#include  

#include     //Thư viện chứa các cấu trúc cần thiết cho socket

#include     //Thư viện chứa các hằng số, cấu trúc khi sử dụng địa chỉ trên internet

#include

Client kết nối và gửi một thông điệp đến server, server nhận và trả lời.

   The port number is passed as an argument */1

   The port number is passed as an argument */2   The port number is passed as an argument */   The port number is passed as an argument */

   The port number is passed as an argument */4   The port number is passed as an argument */5   The port number is passed as an argument */5

   The port number is passed as an argument */6   The port number is passed as an argument */7   The port number is passed as an argument */7

   The port number is passed as an argument */8   The port number is passed as an argument */9   The port number is passed as an argument */9

#include 0#include 1#include 1

#include 2

#include 3

#include 4

#include 5

#include 6

#include 7

#include 8

#include 9#include 0#include 0

#include 1

#include 2

#include 3

#include 4

#include 5

#include 6#include 7#include 7

#include 8

#include 9

Phần tiếp theo giải thích chi tiết mã nguồn

#include 1

#include 2

#include 3

#include 4

#include 5

#include 6

#include 7

#include 8

#include 9

#include 0

#include 1

#include 2#include 3#include 3

#include 2#include 5#include 5

#include 2#include 7#include 7

#include 2   The port number is passed as an argument */1   The port number is passed as an argument */1

3.1. Chương trình server.c      #include  1

   The port number is passed as an argument */0     #include  3

#include  4

#include  5

#include 0

#include  7

#include  0    #include  1    #include  8

#include 2#include     //Thư viện chứa các cấu trúc cần thiết cho socket0#include     //Thư viện chứa các cấu trúc cần thiết cho socket0

#include 2#include     //Thư viện chứa các cấu trúc cần thiết cho socket2#include     //Thư viện chứa các cấu trúc cần thiết cho socket2

#include 2#include     //Thư viện chứa các cấu trúc cần thiết cho socket4#include     //Thư viện chứa các cấu trúc cần thiết cho socket4

#include     //Thư viện chứa các cấu trúc cần thiết cho socket5

#include 2#include     //Thư viện chứa các cấu trúc cần thiết cho socket7#include     //Thư viện chứa các cấu trúc cần thiết cho socket7

#include 2#include     //Thư viện chứa các cấu trúc cần thiết cho socket9#include     //Thư viện chứa các cấu trúc cần thiết cho socket9

#include 2#include     //Thư viện chứa các hằng số, cấu trúc khi sử dụng địa chỉ trên internet1#include     //Thư viện chứa các hằng số, cấu trúc khi sử dụng địa chỉ trên internet1

#include 2#include     //Thư viện chứa các hằng số, cấu trúc khi sử dụng địa chỉ trên internet3#include     //Thư viện chứa các hằng số, cấu trúc khi sử dụng địa chỉ trên internet3

#include 2#include     //Thư viện chứa các hằng số, cấu trúc khi sử dụng địa chỉ trên internet5#include     //Thư viện chứa các hằng số, cấu trúc khi sử dụng địa chỉ trên internet5

#include 2#include     //Thư viện chứa các hằng số, cấu trúc khi sử dụng địa chỉ trên internet7#include     //Thư viện chứa các hằng số, cấu trúc khi sử dụng địa chỉ trên internet7

#include 8

#include     //Thư viện chứa các hằng số, cấu trúc khi sử dụng địa chỉ trên internet9

#include  0    #include  3

#include 1


#include  6

#include

#include

#include

#include

#include 6

#include 7

#include 8

#include 9

   The port number is passed as an argument */00

#include

   The port number is passed as an argument */0

   The port number is passed as an argument */1

   The port number is passed as an argument */04

   The port number is passed as an argument */05

   The port number is passed as an argument */06

   The port number is passed as an argument */07

   The port number is passed as an argument */08

   The port number is passed as an argument */09

   The port number is passed as an argument */10

   The port number is passed as an argument */11

   The port number is passed as an argument */12

   The port number is passed as an argument */13

   The port number is passed as an argument */14

   The port number is passed as an argument */15

   The port number is passed as an argument */16

#include 3

   The port number is passed as an argument */18

   The port number is passed as an argument */19

   The port number is passed as an argument */20

   The port number is passed as an argument */21

   The port number is passed as an argument */22

   The port number is passed as an argument */23

   The port number is passed as an argument */24

   The port number is passed as an argument */25

   The port number is passed as an argument */26

   The port number is passed as an argument */12

   The port number is passed as an argument */28

   The port number is passed as an argument */29

   The port number is passed as an argument */24

   The port number is passed as an argument */31

   The port number is passed as an argument */32

   The port number is passed as an argument */12

   The port number is passed as an argument */34

   The port number is passed as an argument */35   The port number is passed as an argument */36   The port number is passed as an argument */36

   The port number is passed as an argument */37   The port number is passed as an argument */38   The port number is passed as an argument */38

   The port number is passed as an argument */39

   The port number is passed as an argument */40

   The port number is passed as an argument */41

   The port number is passed as an argument */42

   The port number is passed as an argument */43

   The port number is passed as an argument */44

   The port number is passed as an argument */45

   The port number is passed as an argument */41

   The port number is passed as an argument */47

   The port number is passed as an argument */48

   The port number is passed as an argument */49

   The port number is passed as an argument */50

#include 1