Hướng dẫn python unix domain socket multiple clients - ổ cắm miền unix python nhiều máy khách

Nếu bạn tạo ổ cắm PF_UNIX loại SOCK_STREAM và chấp nhận kết nối trên đó, thì mỗi lần bạn chấp nhận kết nối, bạn sẽ nhận được một mô tả tệp mới (là giá trị trả về của cuộc gọi hệ thống accept). Bộ mô tả tệp này đọc dữ liệu từ và ghi dữ liệu vào một bộ mô tả tệp trong quy trình máy khách. Do đó, nó hoạt động giống như kết nối TCP/IP.

Không có định dạng giao thức miền UNIX. Không cần phải có, bởi vì một ổ cắm tên miền Unix không thể được kết nối với một kết nối ngang hàng qua kết nối mạng. Trong kernel, bộ mô tả tệp đại diện cho kết thúc của bạn của ổ cắm tên miền SOCK_STREAM chỉ vào cấu trúc dữ liệu cho kernel biết bộ mô tả tệp nào ở đầu kia của kết nối. Khi bạn viết dữ liệu vào bộ mô tả tệp của mình, kernel sẽ tìm kiếm bộ mô tả tệp ở đầu kia của kết nối và nối dữ liệu vào bộ đệm đọc mô tả tệp khác đó. Hạt nhân không cần phải đặt dữ liệu của bạn vào một gói với tiêu đề mô tả điểm đến của nó.

Đối với ổ cắm SOCK_DGRAM, bạn phải nói với kernel đường dẫn của ổ cắm sẽ nhận dữ liệu của bạn và nó sử dụng nó để tra cứu bộ mô tả tệp cho ổ cắm nhận đó.

Nếu bạn liên kết một đường dẫn với ổ cắm máy khách trước khi bạn kết nối với ổ cắm máy chủ (hoặc trước khi bạn gửi dữ liệu nếu bạn đang sử dụng SOCK_DGRAM), thì quá trình máy chủ có thể nhận đường dẫn đó bằng getpeername (cho SOCK_STREAM). Đối với một SOCK_DGRAM, bên nhận có thể sử dụng recvfrom để có được đường dẫn của ổ cắm gửi.

Nếu bạn không liên kết một đường dẫn, thì quá trình nhận không nhận được ID xác định duy nhất ngang hàng. Ít nhất, không phải trên hạt nhân Linux tôi đang chạy (SOCK_STREAM0).

Tôi không tin rằng tôi thích cách diễn đạt của Steffen Ullrich về chủ đề đó. Các ổ cắm tự nhiên phức tạp vì chúng là một giao diện tổng quát có thể được sử dụng cho một số giao thức rất khác nhau (xem Lưu ý 1).

Để khái quát hóa giữa các giao thức khác nhau, giao diện ổ cắm xác định các tính năng chung của các giao thức khác nhau:

  • Tất cả các giao thức phải có một số cơ chế địa chỉ. (Xem ghi chú 1)
  • Tất cả dữ liệu được gửi từ một địa chỉ đến một địa chỉ.
  • Hai loại giao thức rất hữu ích để thảo luận ở đây:
    • Một số giao thức đại diện cho một kết nối: sock_stream
    • Một số giao thức đại diện cho một loạt các tin nhắn: sock_dgram

Các giao thức sock_stream thường rất khác với các giao thức sock_dgram. Nhưng trong mỗi nhóm này, các giao thức không khác nhau quá nhiều.

SOCK_STREAM

  • Ví dụ: TCP
  • Dữ liệu đến trong một luồng dài mà không bị phá vỡ.
  • Dữ liệu luôn đến theo thứ tự nó đã được gửi

Các giao thức định hướng kết nối luôn luôn (?) Một cặp ổ cắm có dữ liệu được gửi giữa chúng trong một kết nối. Các giao thức kết nối thường cũng hỗ trợ một số hình thức của ổ cắm "nghe", mục đích duy nhất của ai là chờ đợi các yêu cầu kết nối mới.

Hãy nghĩ về các ổ cắm định hướng kết nối như hai điện thoại với một đường giữa chúng.

Gọi SOCK_STREAM1 và SOCK_STREAM2 dẫn đến kết nối mới với hai ổ cắm bị ràng buộc (một ở mỗi bên của kết nối).

SOCK_DGRAM

  • Ví dụ UDP
  • Dữ liệu đến trong cùng một khối (tin nhắn) nó đã được gửi, không được nghiền thành một luồng liên tục
  • Tin nhắn có thể không đến theo thứ tự.

Các giao thức định hướng Datagram rất khác nhau. Ổ cắm có thể được cấu hình để hoạt động một chút như hộp thư, nhận tin nhắn từ bất cứ đâu. Không có yêu cầu để có một kết nối. Trong trường hợp của UDP, bất kỳ gói nào được gửi đến IP và cổng phù hợp từ bất kỳ IP và cổng nào cũng sẽ được chọn bởi cùng một ổ cắm. Vì vậy, bạn có thể tổ chức các cuộc hội thoại với một số máy tính khác nhau thông qua cùng một ổ cắm.

Có một ý nghĩa đặc biệt cho SOCK_STREAM1 trên ổ cắm Sock_dgram.

Nếu sockfd sockfd thuộc loại sock_dgram, thì addr là địa chỉ mà datagram được gửi theo mặc định và địa chỉ duy nhất mà datagram được nhận.

Điều này không tạo ra một kết nối duy nhất mới. Nó chỉ giới hạn tin nhắn nào sẽ được nhận bởi một ổ cắm này chứ không phải ổ cắm ở phía bên kia.

Hàm SOCK_STREAM4 cho phép chương trình gửi tin nhắn và chỉ định địa chỉ để gửi nó.

Ổ cắm tên miền UNIX

Chúng có cả hai hương vị (sock_stream và sock_dgram) giống như ổ cắm Internet (TCP và UDP). Vì vậy, đối với sock_stream unix ổ cắm, vâng, chúng chỉ có một kết nối giữa một cặp ổ cắm. Nhưng các ổ cắm UNIX của Sock_dgram là khác nhau (giống như UDP khác với TCP).


Lưu ý 1: Các ổ cắm UNIX rất sôi nổi vì không có giao thức cơ bản như vậy, chúng là một cấu trúc của hạt nhân. Kernel có thể tự do sử dụng ổ cắm riêng của nó làm cơ chế địa chỉ. Như Mosvy chỉ ra điều này có thể dẫn đến hành vi kỳ lạ khi bạn cố gắng xác định địa chỉ của ổ cắm UNIX.

Nhiều máy khách có thể kết nối với cùng một ổ cắm unix không?

Vâng, bạn có thể. Hạn chế duy nhất là khách hàng của bạn phải có trên máy chủ cục bộ và có quyền truy cập R/W vào tệp giả ổ cắm.. The only constraint is your clients must be on the local host, and have R/W access to the socket pseudo-file.

Làm cách nào để kết nối nhiều máy khách với một máy chủ trong Python?

Kết nối nhiều máy khách trong Python, chúng tôi phải tạo một chức năng hoàn toàn mới và đặt tên cho nó Multi_Threaded_Client ();Điều này kết nối mọi máy khách từ địa chỉ khác nhau được cung cấp bởi máy chủ cùng một lúc.Trong hàm multi_threaded_client, kết nối.create a brand new function and name it multi_threaded_client() ; this connects every client from the various address provided by the server simultaneously. Within the multi_threaded_client function, the connection.

Ổ cắm miền Unix có nhanh hơn không?

Các ổ cắm miền UNIX thường nhanh gấp đôi so với ổ cắm TCP khi cả hai đồng nghiệp đều ở trên cùng một máy chủ.Các giao thức miền UNIX không phải là một bộ giao thức thực tế, mà là cách thực hiện giao tiếp máy khách/máy chủ trên một máy chủ sử dụng cùng một API được sử dụng cho máy khách và máy chủ trên các máy chủ khác nhau.. The Unix domain protocols are not an actual protocol suite, but a way of performing client/server communication on a single host using the same API that is used for clients and servers on different hosts.

Ổ cắm miền Unix có đáng tin cậy không?

Các loại ổ cắm hợp lệ trong miền UNIX là: Sock_Stream, cho một ổ cắm hướng đến luồng;Sock_dgram, đối với một ổ cắm định hướng Datagram bảo tồn các ranh giới tin nhắn (như trên hầu hết các triển khai Unix, ổ cắm dữ liệu tên miền UNIX luôn đáng tin cậy và không sắp xếp lại datagram);và (kể từ Linux 2.6.UNIX domain datagram sockets are always reliable and don't reorder datagrams); and (since Linux 2.6.