Python kiểm tra xem cổng có đang được sử dụng không

Ổ cắm được sử dụng gần như ở khắp mọi nơi, nhưng là một trong những công nghệ bị hiểu lầm nghiêm trọng nhất xung quanh. Đây là tổng quan 10.000 foot về ổ cắm. Nó không thực sự là một hướng dẫn - bạn sẽ vẫn còn nhiều việc phải làm để vận hành mọi thứ. Nó không đề cập đến những điểm tốt [và có rất nhiều điểm], nhưng tôi hy vọng nó sẽ cung cấp cho bạn đủ thông tin cơ bản để bắt đầu sử dụng chúng một cách tử tế

Ổ cắm¶

Tôi sẽ chỉ nói về INET [tôi. e. IPv4], nhưng chúng chiếm ít nhất 99% số ổ cắm đang sử dụng. Và tôi sẽ chỉ nói về STREAM [tôi. e. TCP] - trừ khi bạn thực sự biết mình đang làm gì [trong trường hợp này, HOWTO này không dành cho bạn. ], bạn sẽ nhận được hành vi và hiệu suất tốt hơn từ ổ cắm STREAM hơn bất kỳ thứ gì khác. Tôi sẽ cố gắng làm sáng tỏ bí ẩn về ổ cắm là gì, cũng như một số gợi ý về cách làm việc với ổ cắm chặn và không chặn. Nhưng tôi sẽ bắt đầu bằng cách nói về việc chặn ổ cắm. Bạn sẽ cần biết cách chúng hoạt động trước khi xử lý ổ cắm không chặn

Một phần của rắc rối khi hiểu những điều này là “ổ cắm” có thể có nghĩa là một số thứ khác nhau một cách tinh tế, tùy thuộc vào ngữ cảnh. Vì vậy, trước tiên, hãy phân biệt giữa ổ cắm “máy khách” - điểm cuối của cuộc trò chuyện và ổ cắm “máy chủ”, giống như một nhà điều hành tổng đài. Ứng dụng khách [ví dụ: trình duyệt của bạn] chỉ sử dụng ổ cắm “máy khách”;

Lịch sử¶

Trong số các dạng khác nhau của IPC, ổ cắm cho đến nay là phổ biến nhất. Trên bất kỳ nền tảng nhất định nào, có thể có các dạng IPC khác nhanh hơn, nhưng đối với giao tiếp đa nền tảng, ổ cắm là trò chơi duy nhất trong thị trấn

Chúng được phát minh ở Berkeley như một phần của hương vị BSD của Unix. Chúng lan nhanh như cháy rừng với internet. Với lý do chính đáng — sự kết hợp giữa các ổ cắm với INET giúp việc nói chuyện với các máy tùy ý trên khắp thế giới trở nên dễ dàng đến khó tin [ít nhất là so với các chương trình khác]

Tạo Socket¶

Nói một cách đại khái, khi bạn nhấp vào liên kết đưa bạn đến trang này, trình duyệt của bạn đã thực hiện thao tác như sau

# create an INET, STREAMing socket
s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# now connect to the web server on port 80 - the normal http port
s.connect[["www.python.org", 80]]

Khi

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
6 hoàn thành, ổ cắm
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
7 có thể được sử dụng để gửi yêu cầu văn bản của trang. Ổ cắm tương tự sẽ đọc câu trả lời và sau đó bị hủy. Đúng vậy, bị phá hủy. Ổ cắm máy khách thường chỉ được sử dụng cho một trao đổi [hoặc một nhóm nhỏ trao đổi tuần tự]

Điều gì xảy ra trong máy chủ web phức tạp hơn một chút. Đầu tiên, máy chủ web tạo một “ổ cắm máy chủ”

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]

Một vài điều cần chú ý. chúng tôi đã sử dụng

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
8 để thế giới bên ngoài có thể nhìn thấy ổ cắm. Nếu chúng tôi đã sử dụng
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
9 hoặc
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
0, chúng tôi sẽ vẫn có ổ cắm “máy chủ”, nhưng ổ cắm này chỉ hiển thị trong cùng một máy.
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
0 chỉ định rằng ổ cắm có thể truy cập được bằng bất kỳ địa chỉ nào mà máy tình cờ có

Điều thứ hai cần lưu ý. số lượng cổng thấp thường được dành riêng cho các dịch vụ “nổi tiếng” [HTTP, SNMP, v.v.]. Nếu chơi lung tung thì dùng số cao đẹp [4 số]

Cuối cùng, đối số của

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
1 nói với thư viện ổ cắm rằng chúng tôi muốn nó xếp hàng đợi tối đa 5 yêu cầu kết nối [tối đa bình thường] trước khi từ chối các kết nối bên ngoài. Nếu phần còn lại của mã được viết đúng cách, điều đó sẽ rất nhiều

Bây giờ chúng ta có một ổ cắm “máy chủ”, lắng nghe trên cổng 80, chúng ta có thể vào vòng lặp chính của máy chủ web

while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]

Trên thực tế, có 3 cách chung để vòng lặp này có thể hoạt động - gửi một luồng để xử lý

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
2, tạo một quy trình mới để xử lý
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
2 hoặc cơ cấu lại ứng dụng này để sử dụng ổ cắm không chặn và ghép kênh giữa ổ cắm “máy chủ” của chúng tôi và bất kỳ
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
2 đang hoạt động nào . Thêm về điều đó sau. Điều quan trọng cần hiểu bây giờ là. đây là tất cả những gì một ổ cắm "máy chủ" làm. Nó không gửi bất kỳ dữ liệu nào. Nó không nhận được bất kỳ dữ liệu. Nó chỉ tạo ra các ổ cắm "máy khách". Mỗi
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
2 được tạo để đáp ứng với một số ổ cắm “máy khách” khác đang thực hiện một
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
7 tới máy chủ và cổng mà chúng tôi buộc phải thực hiện. Ngay sau khi chúng tôi tạo ra
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
2 đó, chúng tôi quay lại lắng nghe để tìm thêm kết nối. Hai "khách hàng" có thể tự do trò chuyện - họ đang sử dụng một số cổng được phân bổ động sẽ được sử dụng lại khi cuộc trò chuyện kết thúc

IPC¶

Nếu bạn cần IPC nhanh giữa hai quy trình trên một máy, bạn nên xem xét các đường ống hoặc bộ nhớ dùng chung. Nếu bạn quyết định sử dụng ổ cắm AF_INET, hãy liên kết ổ cắm “máy chủ” với

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
9. Trên hầu hết các nền tảng, điều này sẽ có một phím tắt xung quanh một vài lớp mã mạng và nhanh hơn một chút

Xem thêm

while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
0 tích hợp IPC đa nền tảng vào API cấp cao hơn

Sử dụng Ổ cắm¶

Điều đầu tiên cần lưu ý là ổ cắm “máy khách” của trình duyệt web và ổ cắm “máy khách” của máy chủ web giống hệt nhau. Đó là, đây là một cuộc trò chuyện “ngang hàng”. Hay nói cách khác, với tư cách là nhà thiết kế, bạn sẽ phải quyết định những quy tắc ứng xử trong một cuộc trò chuyện. Thông thường, ổ cắm

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
6ing bắt đầu cuộc trò chuyện bằng cách gửi yêu cầu hoặc có thể là đăng nhập. Nhưng đó là một quyết định thiết kế - nó không phải là quy tắc của ổ cắm

Bây giờ có hai bộ động từ để sử dụng trong giao tiếp. Bạn có thể sử dụng

while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
2 và
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
3 hoặc bạn có thể biến ổ cắm máy khách của mình thành một con thú giống như tệp và sử dụng
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
4 và
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
5. Cái sau là cách Java trình bày các ổ cắm của nó. Tôi sẽ không nói về nó ở đây, ngoại trừ việc cảnh báo bạn rằng bạn cần sử dụng
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
6 trên ổ cắm. Đây là những “tệp” được lưu vào bộ đệm và một lỗi phổ biến là
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
5 thứ gì đó, sau đó
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
4 để trả lời. Nếu không có
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
6 trong đó, bạn có thể đợi mãi để nhận được câu trả lời, vì yêu cầu có thể vẫn nằm trong bộ đệm đầu ra của bạn

Bây giờ chúng ta đến với trở ngại chính của ổ cắm -

while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
2 và
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
3 hoạt động trên bộ đệm mạng. Họ không nhất thiết phải xử lý tất cả các byte mà bạn giao cho họ [hoặc mong đợi từ họ], bởi vì trọng tâm chính của họ là xử lý bộ đệm mạng. Nói chung, chúng quay trở lại khi bộ đệm mạng liên quan đã được lấp đầy [
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
2] hoặc được làm trống [
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
3]. Sau đó, họ cho bạn biết họ đã xử lý bao nhiêu byte. Bạn có trách nhiệm gọi lại cho họ cho đến khi tin nhắn của bạn được xử lý hoàn toàn

Khi một

while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
3 trả về 0 byte, điều đó có nghĩa là phía bên kia đã đóng [hoặc đang trong quá trình đóng] kết nối. Bạn sẽ không nhận được thêm bất kỳ dữ liệu nào trên kết nối này. Bao giờ. Bạn có thể gửi dữ liệu thành công;

Một giao thức như HTTP chỉ sử dụng một ổ cắm cho một lần truyền. Máy khách gửi yêu cầu, sau đó đọc phản hồi. Đó là nó. Ổ cắm bị loại bỏ. Điều này có nghĩa là máy khách có thể phát hiện phần cuối của câu trả lời bằng cách nhận 0 byte

Nhưng nếu bạn định sử dụng lại ổ cắm của mình để chuyển tiếp, bạn cần nhận ra rằng không có EOT trên ổ cắm. tôi lặp lại. nếu ổ cắm

while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
2 hoặc
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
3 trả về sau khi xử lý 0 byte, kết nối đã bị hỏng. Nếu kết nối không bị ngắt, bạn có thể đợi trên
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
3 mãi mãi, vì ổ cắm sẽ không cho bạn biết rằng không còn gì để đọc [hiện tại]. Bây giờ nếu bạn nghĩ về điều đó một chút, bạn sẽ nhận ra một sự thật cơ bản về ổ cắm. tin nhắn phải có độ dài cố định [yuck] hoặc được phân tách [nhún vai] hoặc cho biết thời lượng của chúng [tốt hơn nhiều] hoặc kết thúc bằng cách tắt kết nối. Sự lựa chọn hoàn toàn là của bạn, [nhưng một số cách đúng hơn những cách khác]

Giả sử bạn không muốn kết thúc kết nối, giải pháp đơn giản nhất là một tin nhắn có độ dài cố định

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
0

Mã gửi ở đây có thể sử dụng được cho hầu hết mọi sơ đồ nhắn tin - trong Python bạn gửi các chuỗi và bạn có thể sử dụng

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
08 để xác định độ dài của nó [ngay cả khi nó đã nhúng
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
09 ký tự]. Chủ yếu là mã nhận trở nên phức tạp hơn. [Và trong C, nó không tệ hơn nhiều, ngoại trừ việc bạn không thể sử dụng
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
30 nếu thư đã nhúng các
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
09. ]

Cải tiến đơn giản nhất là làm cho ký tự đầu tiên của tin nhắn trở thành chỉ báo của loại tin nhắn và để loại xác định độ dài. Bây giờ bạn có hai

while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
3 - cái đầu tiên lấy [ít nhất] ký tự đầu tiên đó để bạn có thể tra cứu độ dài và cái thứ hai trong một vòng lặp để lấy phần còn lại. Nếu bạn quyết định đi theo con đường được phân định, bạn sẽ nhận được ở một số kích thước khối tùy ý, [4096 hoặc 8192 thường phù hợp với kích thước bộ đệm mạng] và quét những gì bạn đã nhận được để tìm dấu phân cách

Một biến chứng cần lưu ý. nếu giao thức hội thoại của bạn cho phép nhiều thư được gửi ngược lại [không có một số loại trả lời] và bạn chuyển

while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
3 một kích thước khối tùy ý, thì cuối cùng bạn có thể đọc phần đầu của thư sau. Bạn sẽ cần đặt nó sang một bên và giữ lấy nó, cho đến khi cần

Việc đặt trước tin nhắn với độ dài của nó [chẳng hạn như 5 ký tự số] trở nên phức tạp hơn, bởi vì [tin hay không tùy bạn], bạn có thể không nhận được tất cả 5 ký tự trong một

while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
3. Khi chơi xung quanh, bạn sẽ thoát khỏi nó; . Bẩn thỉu. Đây cũng là lúc bạn phát hiện ra rằng không phải lúc nào
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
2 cũng có thể loại bỏ mọi thứ trong một lượt. Và mặc dù đã đọc điều này, nhưng cuối cùng bạn sẽ nhận ra nó

Vì lợi ích của không gian, xây dựng nhân vật của bạn, [và duy trì vị trí cạnh tranh của tôi], những cải tiến này được để lại như một bài tập cho người đọc. Hãy chuyển sang dọn dẹp

Dữ liệu nhị phân¶

Hoàn toàn có thể gửi dữ liệu nhị phân qua một ổ cắm. Vấn đề chính là không phải tất cả các máy đều sử dụng cùng định dạng cho dữ liệu nhị phân. Ví dụ: thứ tự byte mạng là big-endian, với byte quan trọng nhất trước tiên, do đó, số nguyên 16 bit có giá trị

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
37 sẽ là hai byte hex
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
38. Tuy nhiên, hầu hết các bộ xử lý phổ biến [x86/AMD64, ARM, RISC-V], đều là little-endian, với byte ít quan trọng nhất trước tiên - cùng một
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
37 sẽ là
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
60

Các thư viện ổ cắm có các cuộc gọi để chuyển đổi số nguyên 16 và 32 bit -

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
61 trong đó “n” có nghĩa là mạng và “h” có nghĩa là máy chủ, “s” có nghĩa là ngắn và “l” có nghĩa là dài. Trong trường hợp thứ tự mạng là thứ tự máy chủ, những thứ này không làm gì cả, nhưng khi máy bị đảo ngược byte, chúng sẽ hoán đổi các byte xung quanh một cách thích hợp

Trong những ngày này của các máy 64 bit, biểu diễn ASCII của dữ liệu nhị phân thường nhỏ hơn biểu diễn nhị phân. Đó là bởi vì trong một khoảng thời gian đáng ngạc nhiên, hầu hết các số nguyên đều có giá trị 0 hoặc có thể là 1. Chuỗi

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
62 sẽ là hai byte, trong khi số nguyên 64 bit đầy đủ sẽ là 8. Tất nhiên, điều này không phù hợp với các tin nhắn có độ dài cố định. Quyết định, quyết định

Ngắt kết nối¶

Nói một cách chính xác, bạn phải sử dụng

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
63 trên một ổ cắm trước khi bạn
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
64 nó.
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
63 là một lời khuyên cho ổ cắm ở đầu bên kia. Tùy thuộc vào đối số mà bạn vượt qua, nó có thể có nghĩa là “Tôi sẽ không gửi nữa, nhưng tôi vẫn sẽ nghe”, hoặc “Tôi không nghe, câu đố hay. ”. Tuy nhiên, hầu hết các thư viện ổ cắm đã quá quen với việc các lập trình viên bỏ qua việc sử dụng phần nghi thức này mà thông thường, một
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
64 cũng giống như một
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
67. Vì vậy, trong hầu hết các tình huống, không cần thiết phải có một
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
63 rõ ràng

Một cách để sử dụng

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
63 hiệu quả là trao đổi giống như HTTP. Khách hàng gửi yêu cầu và sau đó thực hiện
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
70. Điều này cho máy chủ biết “Máy khách này đã gửi xong, nhưng vẫn có thể nhận. ” Máy chủ có thể phát hiện “EOF” bằng cách nhận 0 byte. Nó có thể cho rằng nó có yêu cầu hoàn chỉnh. Máy chủ gửi trả lời. Nếu
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
2 hoàn thành thành công thì thực sự, khách hàng vẫn nhận được

Python tiến thêm một bước về tính năng tự động tắt máy và nói rằng khi ổ cắm được thu gom rác, nó sẽ tự động thực hiện

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
64 nếu cần. Nhưng dựa vào đây là một thói quen rất xấu. Nếu ổ cắm của bạn biến mất mà không thực hiện
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
64, thì ổ cắm ở đầu bên kia có thể bị treo vô thời hạn, khiến bạn nghĩ rằng mình đang chậm chạp. Vui lòng
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
64 ổ cắm của bạn khi bạn hoàn tất

Khi ổ cắm chết¶

Có lẽ điều tồi tệ nhất khi sử dụng ổ cắm chặn là điều gì sẽ xảy ra khi phía bên kia gặp khó khăn [không thực hiện

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
64]. Ổ cắm của bạn có khả năng bị treo. TCP là một giao thức đáng tin cậy và nó sẽ đợi rất lâu trước khi từ bỏ kết nối. Nếu bạn đang sử dụng chủ đề, thì toàn bộ chủ đề về cơ bản đã chết. Không có nhiều bạn có thể làm về nó. Miễn là bạn không làm điều gì đó ngớ ngẩn, chẳng hạn như giữ khóa trong khi đọc chặn, chuỗi không thực sự tiêu tốn nhiều tài nguyên. Đừng cố giết luồng - một phần lý do khiến luồng hiệu quả hơn quy trình là vì chúng tránh được chi phí liên quan đến việc tự động tái chế tài nguyên. Nói cách khác, nếu bạn quản lý để tắt luồng, toàn bộ quá trình của bạn có thể sẽ bị hỏng

Ổ cắm không chặn¶

Nếu bạn đã hiểu phần trước, thì bạn đã biết hầu hết những gì bạn cần biết về cơ chế sử dụng ổ cắm. Bạn sẽ vẫn sử dụng các cuộc gọi giống nhau, theo nhiều cách giống nhau. Chỉ là nếu bạn làm đúng thì app của bạn gần như từ trong ra ngoài

Trong Python, bạn sử dụng

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
76 để làm cho nó không bị chặn. Trong C, nó phức tạp hơn, [đối với một điều, bạn sẽ cần chọn giữa hương vị BSD
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
77 và hương vị POSIX gần như không thể phân biệt được
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
78, hoàn toàn khác với
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
79], nhưng đó là cùng một ý tưởng. Bạn làm điều này sau khi tạo ổ cắm, nhưng trước khi sử dụng nó. [Thật ra, nếu bạn dở hơi, bạn có thể chuyển đổi qua lại. ]

Sự khác biệt cơ học chính là

while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
2,
while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
3,
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
6 và
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
83 có thể quay lại mà không cần làm gì cả. Bạn có [tất nhiên] một số lựa chọn. Bạn có thể kiểm tra mã trả về và mã lỗi và thường khiến bản thân phát điên. Nếu bạn không tin tôi, đôi khi hãy thử nó. Ứng dụng của bạn sẽ ngày càng lớn, nhiều lỗi và hút CPU. Vì vậy, hãy bỏ qua các giải pháp chết não và làm đúng

Sử dụng

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
5

Trong C, mã hóa

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
5 khá phức tạp. Trong Python, đó là một miếng bánh, nhưng nó đủ gần với phiên bản C mà nếu bạn hiểu
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
5 trong Python, bạn sẽ gặp chút rắc rối với nó trong C

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
3

Bạn vượt qua

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
5 ba danh sách. cái đầu tiên chứa tất cả các ổ cắm mà bạn có thể muốn thử đọc; . Bạn nên lưu ý rằng một ổ cắm có thể đi vào nhiều danh sách. Cuộc gọi
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
5 đang bị chặn nhưng bạn có thể cho cuộc gọi hết thời gian chờ. Đây thường là một việc hợp lý để làm - hãy chờ một thời gian dài [chẳng hạn như một phút] trừ khi bạn có lý do chính đáng để làm khác

Đổi lại, bạn sẽ nhận được ba danh sách. Chúng chứa các ổ cắm thực sự có thể đọc được, có thể ghi và bị lỗi. Mỗi danh sách này là một tập hợp con [có thể trống] của danh sách tương ứng mà bạn đã nhập

Nếu một ổ cắm nằm trong danh sách đầu ra có thể đọc được, bạn có thể chắc chắn như chúng ta từng tham gia vào công việc kinh doanh này rằng một

while True:
    # accept connections from outside
    [clientsocket, address] = serversocket.accept[]
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = client_thread[clientsocket]
    ct.run[]
3 trên ổ cắm đó sẽ trả về thứ gì đó. Ý tưởng tương tự cho danh sách có thể ghi. Bạn sẽ có thể gửi một cái gì đó. Có thể không phải tất cả những gì bạn muốn, nhưng có gì đó vẫn tốt hơn là không có gì. [Trên thực tế, bất kỳ ổ cắm khỏe mạnh hợp lý nào cũng sẽ trở lại dưới dạng có thể ghi - điều đó chỉ có nghĩa là không gian bộ đệm mạng bên ngoài khả dụng. ]

Nếu bạn có ổ cắm “máy chủ”, hãy đặt nó vào danh sách người đọc tiềm năng. Nếu nó xuất hiện trong danh sách có thể đọc được, thì

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
83 của bạn sẽ [gần như chắc chắn] hoạt động. Nếu bạn đã tạo một ổ cắm mới cho
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
6 cho người khác, hãy đặt nó vào danh sách các nhà văn tiềm năng. Nếu nó xuất hiện trong danh sách có thể ghi, bạn có cơ hội tốt rằng nó đã được kết nối

Trên thực tế,

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
5 có thể tiện dụng ngay cả với ổ cắm chặn. Đó là một cách để xác định xem bạn có chặn hay không - ổ cắm trả về ở dạng có thể đọc được khi có thứ gì đó trong bộ đệm. Tuy nhiên, điều này vẫn không giúp giải quyết vấn đề xác định xem đầu bên kia đã xong chưa hay chỉ đang bận việc khác

cảnh báo về tính di động. Trên Unix,

# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
5 hoạt động với cả ổ cắm và tệp. Đừng thử điều này trên Windows. Trên Windows,
# create an INET, STREAMing socket
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
# bind the socket to a public host, and a well-known port
serversocket.bind[[socket.gethostname[], 80]]
# become a server socket
serversocket.listen[5]
5 chỉ hoạt động với ổ cắm. Cũng lưu ý rằng trong C, nhiều tùy chọn ổ cắm nâng cao hơn được thực hiện khác trên Windows. Trên thực tế, trên Windows, tôi thường sử dụng các luồng [hoạt động rất, rất tốt] với ổ cắm của mình

Làm cách nào để biết một cổng đang được sử dụng?

Kiểm tra việc sử dụng cổng từ Windows .
Khởi động Trình quản lý tác vụ bằng cách nhấn Ctrl+Shift+Esc
Nhấp vào tab Quy trình và nhấp vào Xem rồi chọn Cột
Trong cửa sổ Select Process Page Columns, bấm PID [Process Identifier], sau đó bấm OK

Làm cách nào để biết máy chủ python có hoạt động không?

Làm cách nào để biết máy chủ Python có thể truy cập được hay không? .
nhập nmap, ổ cắm
ip_addr = input['Nhập ip hoặc url để kiểm tra xem up hay down. ']
máy quét = nmap. Máy quét cổng[]
máy chủ = ổ cắm. gethostbyname[ip_addr]
máy quét. quét [máy chủ, '1', '-v']
print["Trạng thái IP. ", máy quét[máy chủ]. tiểu bang[]]

Cổng trong Python là gì?

cổng biểu thị số cổng TCP để chấp nhận kết nối từ máy khách . Nó phải là một số nguyên từ 1 đến 65535, vì 0 được bảo lưu. Một số hệ thống có thể yêu cầu đặc quyền siêu người dùng nếu số cổng nhỏ hơn 1024.

Làm cách nào để kiểm tra xem cổng có đang mở Linux không?

Kiểm tra các cổng đang mở trong Linux .
Mở một ứng dụng đầu cuối Linux
Sử dụng lệnh ss để hiển thị tất cả các cổng TCP và UDP đang mở trong Linux
Một tùy chọn khác là sử dụng lệnh netstat để liệt kê tất cả các cổng trong Linux
Ngoài ss/netstat, người ta có thể sử dụng lệnh lsof để liệt kê các tệp và cổng đang mở trên hệ thống dựa trên Linux

Chủ Đề