man page gửi() cho thấy cờ MSG_MORE
được xác nhận là hành động như TCP_CORK
. Tôi có một chức năng bao bọc xung quanh send()
:Bộ đệm TCP của hạt nhân xả đối với các gói được gắn cờ `MSG_MORE`
int SocketConnection_Write(SocketConnection *this, void *buf, int len) {
errno = 0;
int sent = send(this->fd, buf, len, MSG_NOSIGNAL);
if (errno == EPIPE || errno == ENOTCONN) {
throw(exc, &SocketConnection_NotConnectedException);
} else if (errno == ECONNRESET) {
throw(exc, &SocketConnection_ConnectionResetException);
} else if (sent != len) {
throw(exc, &SocketConnection_LengthMismatchException);
}
return sent;
}
Giả sử tôi muốn sử dụng bộ đệm hạt nhân, tôi có thể đi với TCP_CORK
, cho phép bất cứ khi nào nó là cần thiết và sau đó vô hiệu hóa nó để tuôn ra bộ đệm. Nhưng mặt khác, do đó sự cần thiết cho một cuộc gọi hệ thống bổ sung phát sinh. Do đó, việc sử dụng MSG_MORE
có vẻ phù hợp hơn với tôi. Tôi chỉ đơn giản muốn thay đổi dòng gửi ở trên() tới:
int sent = send(this->fd, buf, len, MSG_NOSIGNAL | MSG_MORE);
Theo lwm.net, gói sẽ được rửa tự động nếu chúng đủ lớn:
Nếu một ứng dụng đặt rằng tùy chọn trên một socket, hạt nhân sẽ không gửi ra các gói tin ngắn . Thay vào đó, nó sẽ đợi cho đến khi đủ dữ liệu hiển thị để điền một gói kích thước tối đa, sau đó gửi nó. Khi TCP_CORK bị tắt, mọi dữ liệu còn lại sẽ xuất hiện trên dây .
Nhưng phần này chỉ đề cập đến TCP_CORK
. Bây giờ, cách thích hợp để tuôn ra các gói MSG_MORE
là gì?
tôi chỉ có thể nghĩ đến hai khả năng:
- Gọi send() với một bộ đệm rỗng và không có
MSG_MORE
được thiết - Tái áp dụng các tùy chọn TCP_CORK như mô tả trên this trang
Thật không may là toàn bộ chủ đề là rất kém tài liệu và tôi không thể tìm thấy nhiều trên Internet.
Tôi cũng tự hỏi cách kiểm tra xem mọi thứ có hoạt động như mong đợi không? Rõ ràng là chạy máy chủ thông qua strace
không phải là một tùy chọn. Vì vậy, cách đơn giản nhất là sử dụng netcat
và sau đó nhìn vào đầu ra strace
của nó? Hoặc hạt nhân sẽ xử lý lưu lượng truy cập được truyền qua một giao diện loopback khác nhau?
sendfile() giữ lại cờ 'MSG_MORE'. Bộ nhớ cache sau đó được flushed khi sendfile() trả về. – user206268