Kode Kontrol SIO_IDEAL_SEND_BACKLOG_QUERY

Deskripsi

Kode kontrol SIO_IDEAL_SEND_BACKLOG_QUERY mengambil nilai kirim backlog (ISB) yang ideal untuk koneksi yang mendasar.

Untuk melakukan operasi ini, panggil fungsi WSAIoctl atau WSPIoctl dengan parameter berikut.

int WSAIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_IDEAL_SEND_BACKLOG_QUERY, // dwIoControlCode
  NULL,                         // lpvInBuffer
  0,                            // cbInBuffer
  (LPVOID) lpvOutBuffer,         // output buffer
  (DWORD) cbOutBuffer,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
);
int WSPIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_IDEAL_SEND_BACKLOG_QUERY, // dwIoControlCode
  NULL,                         // lpvInBuffer
  0,                            // cbInBuffer
  (LPVOID) lpvOutBuffer,         // output buffer
  (DWORD) cbOutBuffer,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
  (LPWSATHREADID) lpThreadId,   // a WSATHREADID structure
  (LPINT) lpErrno   // a pointer to the error code.
);

Parameter

s

Deskriptor yang mengidentifikasi soket.

dwIoControlCode

Kode kontrol untuk operasi. Gunakan SIO_IDEAL_SEND_BACKLOG_QUERY untuk operasi ini.

lpvInBuffer

Penunjuk ke buffer input. Parameter ini tidak digunakan untuk operasi ini.

cbInBuffer

Ukuran, dalam byte, dari buffer input. Parameter ini tidak digunakan untuk operasi ini.

lpvOutBuffer

Penunjuk ke buffer output. Parameter ini harus menunjuk ke jenis data ULONG jika parameter lpOverlapped dan lpCompletionRoutine adalah NULL.

cbOutBuffer

Ukuran, dalam byte, dari buffer output. Parameter ini harus setidaknya ukuran jenis data ULONG .

lpcbBytesReturned

Penunjuk ke variabel yang menerima ukuran, dalam byte, dari data yang disimpan dalam buffer output.

Jika buffer output terlalu kecil, panggilan gagal, WSAGetLastError mengembalikan WSAEINVAL, dan parameter lpcbBytesReturned menunjuk ke nilai DWORD nol.

Jika lpOverlappedadalah NULL, nilai DWORD yang diarahkan oleh parameter lpcbBytesReturned yang dikembalikan pada panggilan yang berhasil tidak boleh nol.

Jika parameter lpOverlapped bukan NULL untuk soket yang tumpang tindih, operasi yang tidak dapat segera diselesaikan akan dimulai, dan penyelesaian akan ditunjukkan di lain waktu. Nilai DWORD yang ditunjukkan oleh parameter lpcbBytesReturned yang dikembalikan mungkin nol karena ukuran data yang disimpan tidak dapat ditentukan sampai operasi yang tumpang tindih selesai. Status penyelesaian akhir dapat diambil ketika metode penyelesaian yang sesuai disinyalir ketika operasi telah selesai.

lpvOverlapped

Penunjuk ke struktur WSAOVERLAPPED .

Jika soket dibuat tanpa atribut yang tumpang tindih, parameter lpOverlapped diabaikan.

Jika s dibuka dengan atribut yang tumpang tindih dan parameter lpOverlapped bukan NULL, operasi dilakukan sebagai operasi yang tumpang tindih (asinkron). Dalam hal ini, parameter lpOverlapped harus menunjuk ke struktur WSAOVERLAPPED yang valid.

Untuk operasi yang tumpang tindih, fungsi WSAIoctl atau WSPIoctl segera kembali, dan metode penyelesaian yang sesuai disinyalir ketika operasi telah selesai. Jika tidak, fungsi tidak kembali sampai operasi selesai atau terjadi kesalahan.

lpCompletionRoutine

Jenis: LPWSAOVERLAPPED_COMPLETION_ROUTINE _In_opt_

Penunjuk ke rutinitas penyelesaian yang dipanggil ketika operasi telah selesai (diabaikan untuk soket yang tidak tumpang tindih).

lpThreadId

Penunjuk ke struktur WSATHREADID yang akan digunakan oleh penyedia dalam panggilan berikutnya ke WPUQueueApc. Penyedia harus menyimpan struktur WSATHREADID yang direferensikan (bukan penunjuk ke yang sama) sampai setelah fungsi WPUQueueApc kembali.

Catatan Parameter ini hanya berlaku untuk fungsi WSPIoctl .

lpErrno

Penunjuk ke kode kesalahan.

Catatan Parameter ini hanya berlaku untuk fungsi WSPIoctl .

Mengembalikan nilai

Jika operasi berhasil diselesaikan, fungsi WSAIoctl atau WSPIoctl mengembalikan nol.

Jika operasi gagal atau tertunda, fungsi WSAIoctl atau WSPIoctl mengembalikan SOCKET_ERROR. Untuk mendapatkan informasi kesalahan yang diperluas, panggil WSAGetLastError.

Kode kesalahan Makna
WSA_IO_PENDING Operasi yang tumpang tindih berhasil dimulai dan penyelesaian akan ditunjukkan di lain waktu.
WSA_OPERATION_ABORTED Operasi yang tumpang tindih dibatalkan karena penutupan soket atau eksekusi perintah SIO_FLUSH IOCTL.
WSAEFAULT Parameter lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped atau lpCompletionRoutine tidak sepenuhnya terkandung dalam bagian ruang alamat pengguna yang valid.
WSAEINPROGRESS Fungsi ini dipanggil ketika panggilan balik sedang berlangsung.
WSAEINTR Operasi pemblokiran terganggu.
WSAEINVAL Parameter dwIoControlCode bukan perintah yang valid, atau parameter input tertentu tidak dapat diterima, atau perintah tidak berlaku untuk jenis soket yang ditentukan. Kesalahan ini dikembalikan jika parameter cbOutBuffer kurang dari ukuran jenis data ULONG .
WSAENETDOWN Subsistem jaringan gagal.
WSAENOPROTOOPT Opsi soket tidak didukung pada protokol yang ditentukan.
WSAENOTCONN Soket tidak tersambung.
WSAENOTSOCK Deskriptor bukan soket.
WSAEOPNOTSUPP Perintah IOCTL yang ditentukan tidak didukung. Kesalahan ini dikembalikan jika SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL tidak didukung oleh penyedia transportasi. Kesalahan ini juga dikembalikan ketika upaya untuk menggunakan SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL dibuat pada soket datagram.

Keterangan

IOCTL SIO_IDEAL_SEND_BACKLOG_QUERY didukung pada Windows Server 2008, Windows Vista dengan Service Pack 1 (SP1), dan versi sistem operasi yang lebih baru.

Saat mengirim data melalui koneksi TCP menggunakan soket Windows, penting untuk menjaga jumlah data yang cukup terutang (dikirim tetapi belum diakui) di TCP untuk mencapai throughput tertinggi. Nilai ideal untuk jumlah data yang beredar untuk mencapai throughput terbaik untuk koneksi TCP disebut ukuran send backlog (ISB) yang ideal. Nilai ISB adalah fungsi dari produk penundaan bandwidth dari koneksi TCP dan jendela penerima yang diiklankan penerima (dan sebagian jumlah kemacetan dalam jaringan).

Nilai ISB per koneksi tersedia dari implementasi protokol TCP di Windows Server 2008, Windows Vista dengan SP1, dan versi sistem operasi yang lebih baru. IOCTL SIO_IDEAL_SEND_BACKLOG_QUERY dapat digunakan oleh aplikasi untuk mendapatkan pemberitahuan ketika nilai ISB berubah secara dinamis untuk koneksi.

Pada Windows Server 2008, Windows Vista dengan SP1, dan versi sistem operasi yang lebih baru, IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE dan SIO_IDEAL_SEND_BACKLOG_QUERY didukung pada soket berorientasi aliran yang dalam keadaan terhubung.

Rentang untuk nilai ISB untuk koneksi TCP secara teoritis dapat bervariasi dari 0 hingga maksimum 16 megabyte.

Penggunaan umum IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE dan SIO_IDEAL_SEND_BACKLOG_QUERY didasarkan pada metode kirim yang digunakan oleh aplikasi. Dua kasus umum dibahas.

Aplikasi yang melakukan satu pemblokiran atau permintaan pengiriman non-pemblokiran pada satu waktu biasanya mengandalkan buffer pengiriman internal oleh Winsock untuk mencapai throughput yang layak. Batas buffer kirim untuk koneksi tertentu dikontrol oleh opsi soket SO_SNDBUF . Untuk metode pemblokiran dan pengiriman non-pemblokiran, batas buffer kirim menentukan berapa banyak data yang tetap luar biasa dalam TCP. Jika nilai ISB untuk koneksi lebih besar dari batas buffer kirim, maka throughput yang dicapai pada koneksi tidak akan optimal. Untuk mencapai throughput yang lebih baik, aplikasi dapat mengatur batas buffer kirim berdasarkan hasil kueri ISB saat pemberitahuan perubahan ISB terjadi pada koneksi.

Untuk aplikasi yang menggunakan metode pengiriman yang tumpang tindih dengan beberapa permintaan pengiriman yang luar biasa, jumlah data yang tetap terutang dalam TCP ditentukan oleh batas buffer pengiriman di Winsock dan jumlah total data yang terkandung dalam permintaan pengiriman yang tumpang tindih yang luar biasa. Dalam hal ini, aplikasi harus menggunakan nilai ISB untuk menentukan berapa banyak permintaan pengiriman yang luar biasa yang harus mereka simpan dan berapa ukuran data untuk setiap permintaan pengiriman. Idealnya, aplikasi harus mencoba menjaga persamaan berikut terpenuhi:

ISB value == send buffer limit + (number of simultaneous overlapped send requests * data length per send request)

Perhatikan bahwa menggunakan ISB IOCTLs melalui soket TCP dengan cara di atas dapat menyebabkan peningkatan penggunaan memori dengan imbalan peningkatan throughput pada koneksi dengan produk penundaan bandwidth tinggi. Implementasi TCP dalam Windows akan membatasi nilai ISB seperlunya berdasarkan penggunaan memori sistem secara keseluruhan.

IOCTL SIO_IDEAL_SEND_BACKLOG_QUERY hanya diizinkan pada soket aliran yang dalam status tersambung. Jika tidak, fungsi WSAIoctl atau WSPIoctl akan gagal dengan WSAENOTCONN.

IOCTL apa pun dapat memblokir tanpa batas waktu, tergantung pada implementasi penyedia layanan. Jika aplikasi tidak dapat mentolerir pemblokiran dalam panggilan fungsi WSAIoctl atau WSPIoctl , I/O yang tumpang tindih akan disarankan untuk IOCTL yang kemungkinan besar akan diblokir.

IOCTL SIO_IDEAL_SEND_BACKLOG_QUERY tidak mungkin diblokir sehingga biasanya dipanggil secara sinkron dengan parameter lpOverlapped dan lpCompletionRoutine yang diatur ke NULL.

IOCTL SIO_IDEAL_SEND_BACKLOG_QUERY dapat gagal dengan WSAEINTR atau WSA_OPERATION_ABORTED dalam kasus berikut:

Koneksi TCP terputus dengan baik ke arah pengiriman. Ini dapat terjadi sebagai akibat dari panggilan ke fungsi matikan dengan bagaimana parameter diatur ke SD_SEND, panggilan ke fungsi DisconnectEx , atau panggilan ke fungsi TransmitFile atau TransmitPackets dengan parameter dwFlags diatur ke TF_DISCONNECT atau TF_REUSE. Koneksi TCP telah direset atau dibatalkan. Permintaan dibatalkan oleh Manajer I/O.

Dua fungsi pembungkus sebaris untuk IOCTL ini didefinisikan dalam file header Ws2tcpip.h . Disarankan agar fungsi sebaris ini digunakan alih-alih menggunakan SIO_IDEAL_SEND_BACKLOG_CHANGE dan IOCTL SIO_IDEAL_SEND_BACKLOG_QUERY secara langsung.

Fungsi pembungkus sebaris untuk SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL adalah fungsi idealsendbacklognotify .

Fungsi pembungkus sebaris untuk SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL adalah fungsi idealsendbacklogquery .

Buffering pengiriman dinamis untuk TCP ditambahkan pada Windows 7 dan Windows Server 2008 R2. Secara default, buffering pengiriman dinamis untuk TCP diaktifkan kecuali aplikasi mengatur opsi soket SO_SNDBUF pada soket aliran.

Menggunakan netsh adalah metode yang disarankan untuk mengkueri atau mengatur buffering pengiriman dinamis untuk TCP.

Nilai saat ini untuk buffering pengiriman dinamis untuk TCP dapat diambil menggunakan perintah berikut:

netsh winsock show autotuning

Buffering pengiriman dinamis untuk TCP dapat dinonaktifkan menggunakan perintah berikut:

netsh winsock set autotuning off

Buffering pengiriman dinamis untuk TCP dapat diaktifkan menggunakan perintah berikut:

netsh winsock set autotuning on

Meskipun tidak disarankan, buffering pengiriman dinamis dapat dinonaktifkan dari aplikasi dengan mengatur nilai registri berikut ke nol:

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\AFD\Parameters\DynamicSendBufferDisable

Saat mengubah nilai untuk buffering pengiriman dinamis menggunakan NetSh.exe atau mengubah nilai registri, komputer harus dimulai ulang agar perubahan diterapkan.

Dengan buffering pengiriman dinamis pada Windows 7 dan Windows Server 2008 R2, penggunaan IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE dan SIO_IDEAL_SEND_BACKLOG_QUERY hanya diperlukan dalam keadaan khusus.

Lihat juga

SIO_IDEAL_SEND_BACKLOG_CHANGE

Soket

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW