Kích thước bộ đệm ổ cắm Python

Câu hỏi của tôi là về lập trình ổ cắm bằng Python trên Linux, nhưng vì mô-đun

f'{len("your message here!"):<10}'
2 của Python chỉ là một trình bao bọc các cuộc gọi hệ thống (
f'{len("your message here!"):<10}'
3,
f'{len("your message here!"):<10}'
4, v.v. ), nó không hẳn là về Python

Vì vậy, theo , khi chúng ta gọi một phương thức

f'{len("your message here!"):<10}'
3,

Để phù hợp nhất với thực tế phần cứng và mạng, giá trị của bufsize phải là lũy thừa tương đối nhỏ của 2, ví dụ: 4096

Nó có nghĩa là gì?

phù hợp nhất với thực tế phần cứng và mạng

Chủ yếu tôi quan tâm đến hiệu suất

Nó có phải là một nút cổ chai trong phần mềm mạng của tôi không, nếu tôi chuyển bộ đệm tùy chỉnh của mình (mà tôi sử dụng làm bộ chứa dữ liệu sau này trong mã của mình, đó chỉ là một chế độ xem bộ nhớ nếu nó quan trọng) với một số kích thước tùy chỉnh không phải là sức mạnh của hai phương pháp

Nó sẽ chỉ là một dòng mã, rõ ràng và ngắn gọn

Nhưng kích thước bộ đệm của tôi có thể là 17 hoặc 51 hoặc bất cứ thứ gì, vì vậy tôi tự hỏi, tôi có nên triển khai một số bộ đệm giống như vòng bên trong với kích thước "tốt" (như 4096) và sử dụng nó để đọc dữ liệu từ ổ cắm theo từng khối với

Liệu nó có bất kỳ ý nghĩa về hiệu suất?

Hoặc sơ đồ hiện tại của tôi (khi tôi đọc dữ liệu từ một ổ cắm theo khối có kích thước "xấu", không khớp với quy tắc "sức mạnh của 2") có ổn không?

Nói cách khác. nó có ảnh hưởng đến hiệu suất không, nếu chúng ta đọc từ các ổ cắm theo khối có kích thước 1023, thay vì 1024?

Chào mừng các bạn đến với phần 2 của hướng dẫn socket với Python. Trong hướng dẫn trước, chúng ta đã học cách gửi và nhận dữ liệu bằng cách sử dụng ổ cắm, nhưng sau đó chúng ta đã minh họa vấn đề có thể phát sinh khi giao tiếp của chúng ta vượt quá kích thước bộ đệm. Trong hướng dẫn này, chúng ta sẽ nói về việc khắc phục điều này

Như đã đề cập trước đây, có một vài cách hợp lý mà bạn có thể xử lý cho việc này, nhưng một cách phổ biến là bắt đầu tất cả các thư với tiêu đề chứa độ dài của thư sắp đến. Thử thách tiếp theo là bình thường hóa tiêu đề này theo một cách nào đó. Bạn có thể cân nhắc sử dụng một số chuỗi ký tự hoặc một số định dạng, nhưng sau đó bạn có nguy cơ bị mọi người vô tình hoặc cố ý bắt chước định dạng này. Thay vào đó, bạn có thể sử dụng tiêu đề có độ dài cố định, trong đó

f'{len("your message here!"):<10}'
0 byte dữ liệu đầu tiên sẽ là dữ liệu tiêu đề, dữ liệu này sẽ bao gồm độ dài của thư sắp tới. Khi chúng tôi đã nhận được độ dài dữ liệu đó, chúng tôi biết mọi thông tin sau đây sẽ là một thông báo mới, nơi chúng tôi cần lấy tiêu đề và tiếp tục lặp lại quy trình này

Vì vậy, những gì chúng ta cần làm bây giờ là chọn một số kích thước tin nhắn thực sự tối đa. Nói, 1.000.000.000 byte. Đúng vậy, hầu như không có trường hợp nào mà ai đó sẽ cố gắng làm bất cứ điều gì gần như thế này thông qua ứng dụng trò chuyện của chúng tôi, vì vậy điều này sẽ ổn thôi. Con số đó là 10 byte (10 ký tự). Trong python, làm cách nào chúng ta có thể biểu thị bất kỳ số nào dưới dạng 10 ký tự? . khái niệm cơ bản. Vì đây là chức năng ít người dùng nên xem thêm tại đây. , mà bạn sẽ thấy các ví dụ như

#Aligning the text and specifying a width:

>>>
>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'

Trong trường hợp này, bạn có thể xem các ví dụ khác nhau trong đó có 30 ký tự được sử dụng mỗi lần, nhưng bạn có thể thực hiện nhiều cách sắp xếp khác nhau. Mặc dù điều này chủ yếu được sử dụng để làm cho GUI dựa trên văn bản trở nên đẹp mắt, nhưng chúng tôi cũng có thể sử dụng điều này cho các mục đích của mình, chẳng hạn như

f'{len("your message here!"):<10}'

Trong trường hợp trên, điều này sẽ tạo ra độ dài của tin nhắn của chúng tôi bằng 10 ký tự

>>> f'{len("your message here!"):<10}'
'18        '

Tất cả những gì chúng ta làm bây giờ chỉ là gửi trước tất cả các tin nhắn của chúng ta với điều này, sau đó chúng ta có thể chuyển đổi 10 ký tự đầu tiên của tin nhắn mới thành một int để biết thêm bao nhiêu là một phần của một tin nhắn duy nhất. Để làm điều này, chúng tôi sẽ bắt đầu trong kịch bản máy chủ của chúng tôi

f'{len("your message here!"):<10}'
1

import socket

HEADERSIZE = 10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1241))
s.listen(5)

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept()
    print(f"Connection from {address} has been established.")

    msg = "Welcome to the server!"
    msg = f"{len(msg):<{HEADERSIZE}}"+msg

    clientsocket.send(bytes(msg,"utf-8"))

Vì vậy, bây giờ tin nhắn của chúng tôi sẽ có tiêu đề gồm 10 ký tự/byte sẽ chứa độ dài của tin nhắn mà khách hàng của chúng tôi sử dụng để thông báo khi nhận được phần cuối của tin nhắn. Hãy làm việc trên

f'{len("your message here!"):<10}'
2 tiếp theo

f'{len("your message here!"):<10}'
2

________số 8

Cái này liên quan nhiều hơn một chút, nhưng không có gì quá điên rồ ở đây. Tôi đã tăng bộ đệm lên 16 byte. 8 thậm chí sẽ không đủ để đọc tiêu đề, vì vậy đó sẽ là một vấn đề và có lẽ bạn sẽ không bao giờ có bộ đệm nhỏ như thế này. Chúng tôi chỉ làm ví dụ. Vì vậy, chúng tôi bắt đầu ở trạng thái mà bit dữ liệu tiếp theo chúng tôi nhận được là một

f'{len("your message here!"):<10}'
4

Nếu thư là

f'{len("your message here!"):<10}'
4, thì điều đầu tiên chúng tôi làm là phân tích cú pháp tiêu đề mà chúng tôi đã biết là có độ dài cố định gồm 10 ký tự. Từ đây, chúng tôi phân tích độ dài tin nhắn. Sau đó, chúng tôi tiếp tục xây dựng
f'{len("your message here!"):<10}'
6, cho đến khi var đó có kích thước bằng
f'{len("your message here!"):<10}'
7 +
f'{len("your message here!"):<10}'
8 của chúng tôi. Khi điều này xảy ra, chúng tôi sẽ in ra toàn bộ thông báo

Đi từ đây đến một số loại API phát trực tuyến khá đơn giản. Hãy làm một ví dụ trong đó máy chủ chỉ truyền một thứ gì đó đơn giản, chẳng hạn như thời gian hiện tại

Để làm điều này, chúng tôi chỉ cần thêm phần sau vào cuối

#Aligning the text and specifying a width:

>>>
>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'
4

f'{len("your message here!"):<10}'
1 đầy đủ của chúng tôi bây giờ là

#Aligning the text and specifying a width:

>>>
>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'
6

Bây giờ, không có gì thay đổi đối với khách hàng của chúng tôi, ngoại trừ việc chuẩn bị rằng chúng tôi sẽ chấp nhận thư mới sau lần đầu tiên, vì vậy chúng tôi cần đặt lại biến

f'{len("your message here!"):<10}'
6, để toàn bộ
f'{len("your message here!"):<10}'
2 của chúng tôi trở thành

#Aligning the text and specifying a width:

>>>
>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'
9

Bây giờ, hãy chạy hai thứ này và bạn sẽ thấy máy chủ xuất ra một cái gì đó giống như

f'{len("your message here!"):<10}'
0

Và khách hàng

f'{len("your message here!"):<10}'
1

Trong hướng dẫn tiếp theo, chúng ta sẽ nói về cách chúng ta có thể gửi các đối tượng Python thay vì chỉ các chuỗi

hướng dẫn tiếp theo. Hướng dẫn về socket với Python 3 phần 3 - gửi và nhận đối tượng Python với socket

Kích thước bộ đệm trong ổ cắm là gì?

Kích thước bộ đệm cho các kết nối ổ cắm giữa máy chủ web và Máy chủ ứng dụng WebSphere được đặt ở mức 64KB . Trong hầu hết các trường hợp, giá trị này là đủ.

Ổ cắm có bộ đệm không?

Một ổ cắm có hai bộ đệm và một số thông tin khác được liên kết với nó. Trong ngữ cảnh lập trình ổ cắm, ổ cắm là giao diện ứng dụng của bạn với một kết nối TCP (hoặc luồng UDP). Ứng dụng của bạn không trực tiếp đọc/ghi dữ liệu từ/đến thẻ giao diện mạng (NIC), nó đi qua ngăn xếp mạng của nhân.

Bộ đệm ổ cắm TCP là gì?

Nói một cách đơn giản, Cửa sổ nhận TCP là bộ đệm ở mỗi bên của kết nối TCP giữ tạm thời dữ liệu đến . Dữ liệu trong bộ đệm này được gửi đến ứng dụng, xóa thêm chỗ cho dữ liệu đến.

Kích thước bộ đệm recv là gì?

Giá trị thuộc tính . Kích thước của bộ đệm nhận, tính bằng byte. Giá trị mặc định là 8192 byte .