Tìm hiểu về lập trình socket - Bước đầu làm quen
socket
1
network
12
White

nguyenduyhao1111 viết ngày 22/11/2016

Mở đầu

Khi bạn đi sâu vào thế giới linux , bạn tìm thấy nhiều điều khó có thể hiểu ngay lập tức.
Và 1 trong những thứ này là khái niệm socket. Tôi đoán rằng bạn nghe nói về “sockets” rất nhiều lần, dường như bạn đang tự hỏi chúng chính xác là cái gì?

Socket là gì?

Có 1 vài cách định nghĩa như sau :

  • Cách sử dụng standard Unix file descriptors để giao tiếp với các chương trình khác. Hoặc như sau:
  • Socket is method for accomplishing interprocess communcation(IPC). Nghĩa là một socket được sử dụng để cho phép 1 process nói chuyện với 1 process khác. Rất giống với định nghĩa 1 chiếc điện thoại - cho phép 1 người nói chuyện với 1 người khác.

Và bạn hay nghe tới điều mà đa số các tay hacker Unix nói : "Mọi thứ trong linux đều là file" .

Cái mà con người thường nói về thực tế là khi các chương trình Unix làm điều gì đó sắp xếp của I/O, đọc và ghi là bởi file descriptor. Một file descriptor đơn giản là một con số được kết nối với một file mở. Mở rộng ra một file có thể là network connection, một FIFO, một pipe, một terminal, một file thật trên đĩa, hoặc các thứ còn lại. Mọi thứ trong Unix là một file. Vì vậy khi bạn muốn giao tiếp với một chương trình khác trên Internet bạn làm việc với một file descriptor.

OK! “Tôi lấy ra các file desciptor này ở đâu để có thể giao tiếp mạng?”
Bạn dùng bộ API Berkeley sockets! Ở đây tôi đang nói về Unix và Berkeley socket nhé.
Đơn giản là bạn tạo một system call socket() . Nó trả về một socket descriptor, và bạn giao tiếp với nó thông qua các sockets call gọi là send()recv() .

Bạn đọc tinh túy sẽ thắc mắc, nếu là 1 file descriptor vậy taị sao không dùng 2 hàm read() và write().
Câu trả lời là được chứ. Tuy nhiên chúng ta sẽ dùng send()recv() để control tốt data transmission.

Thiết lập giao tiếp

Để dễ hiểu hơn! Chúng ta quay trở lại với chiếc điện thoại.
Đầu tiên muốn gọi-nghe từ điện thoại của ai đó. Bạn phải có 1 chiếc điện thoại.
Điều này đồng nghĩa là :

  1. Mua mới 1 chiếc điện thoại Nó là việc bạn tạo 1 socket để chú ý lắng nghe các connections. Method socket() sẽ làm việc này. Vậy có nhiều người cùng có điện thoại. Vậy làm sao để biết được bạn sẽ gọi cho ai?
  2. Bạn cần 1 địa chỉ liên lạc riêng biệt .
    Như vậy bạn cần đánh địa chỉ cho socket của mình. Method bind() sẽ làm tốt việc này. Thường thì chúng ta sử dụng 2 loại:

    • AF_UNIX : UNIX pathnames
    • AF_INET : Internet address : Sử dụng các số 4 bytes . Ví dụ : 192.168.1.1 Và chúng ta có thường dùng 2 loại socket. Có 2 option sau để phân biệt:
    • SOCK_STREAM
    • SOCK_DGRAM

    Tương ứng với Stream Sockets và Datagram Sockets. Đôi lúc gọi datagram sockets là “Connectionless sockets”. Stream Socket có 2 cách thiếp lập giao tiếp stream.
    Nếu output của bạn là 2 item đến socket theo thứ tự là “1,2” , chúng sẽ nhận theo thứ tự “1,2”.
    Cái gì sử dụng stream sockets? Có nhiều tool và điển hình browser get 1 trang web. Cây html bạn nhận được sẽ đúng theo thứ tự nó được trình bày.
    OK. Chúng ta tiếp tục với tình huống : Nhiều người cùng gọi vào số 1 số điện thoại.

  3. Bạn đưa các cuộc gọi cùng lúc vào danh sách đợi.
    Method listen() làm tốt việc này. Nó thiết lập số maximum các request ( thường là 5).

  4. Khi cuộc gọi tới bạn chấp nhận nó. Điện thoại đổ chuông.
    Method accept() làm việc chấp nhận request, thành lập 1 connection. Tuy nhiên, bạn có thể accept khi đang xử lý 1 process trước đó.
    Tới đây bạn đang nhận 1 các cuộc gọi tới.

  5. Gọi đi
    Cách để call 1 socket là dùng method connect(). Vậy làm sao để gọi cho nửa kia. Bạn phải có số điện thoại người ấy. Như vậy bạn phải có 1 địa chỉ socket đang ready. Sẵn sàng lắng nghe các cuộc gọi đến.

  6. Trao đổi
    Và giờ bạn đã có 1 connection giữa socket, bạn muốn send data giữa chúng.
    Hàm send() và recv() được sử dụng ở đây… Cuộc nói chuyện tiếp diễn…

  7. Kết thúc
    Cuộc nói chuyện nào cũng có hồi kết.
    Hàm close() được sử dụng ở đây.

Tuy nhiên, cuộc nói chuyện cần được trình bày theo đúng thứ tự của nó.
Khi bạn nói thì có thể gặp vấn đề không đúng thứ tự
Ví dụ:
1.Chào buổi sáng
2.Chào tạm biệt

Có thể thành ra:

1.Chào tạm biệt
2.Chào buối sáng

Do đó bạn nên dùng các phương thức sau cho first message.

  • hons() : host to network short integer
  • ntohs(): network to host short integer
  • ntohl(): host to network long integer
  • ntohl(): network to host long integer

Ví dụ: Dùng htonl

i= htonl(i);
write_data(s, &i, sizeof(i)); 

Sau khi nhận data bạn nên convert nó lại

read_data(s, &i, sizeof(i));
i= ntohl(i)

Lời kết

Phần này mới chỉ bắt đầu đi về thiết lập giao tiếp. Phần sau sẽ đi sâu vào các thuật toán của TCP và UDP.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

nguyenduyhao1111

12 bài viết.
39 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
12 0
Trước khi so sánh khác nhau về HDFS và HDFS2. Chúng ta đi tìm hiểu về HDFS là cái gì, kiến trúc thế nào? Vì sao điều này lại quan trọng. Bởi vì đâ...
nguyenduyhao1111 viết hơn 1 năm trước
12 0
White
10 0
Khái niệm : Mapreduce là một mô hình lập trình, thực hiện quá tình xử lý tập dữ liệu lớn. Mapreduce gồm 2 pha : map và reduce. Hàm Map : Các xử l...
nguyenduyhao1111 viết gần 2 năm trước
10 0
White
10 0
Hadoop là cái gì vậy? “Hadoop là một framework nguồn mở viết bằng Java cho phép phát triển các ứng dụng phân tán có cường độ dữ liệu lớn một cách ...
nguyenduyhao1111 viết gần 2 năm trước
10 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
12 bài viết.
39 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!