Bagikan melalui


Fungsi TransmitFile (mswsock.h)

Fungsi TransmitFile mengirimkan data file melalui handel soket yang terhubung. Fungsi ini menggunakan manajer cache sistem operasi untuk mengambil data file, dan menyediakan transfer data file berkinerja tinggi melalui soket.

Catatan Fungsi ini adalah ekstensi khusus Microsoft untuk spesifikasi Windows Sockets.

 

Sintaks

BOOL TransmitFile(
  SOCKET                  hSocket,
  HANDLE                  hFile,
  DWORD                   nNumberOfBytesToWrite,
  DWORD                   nNumberOfBytesPerSend,
  LPOVERLAPPED            lpOverlapped,
  LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
  DWORD                   dwReserved
);

Parameter

hSocket

Handel ke soket yang tersambung. Fungsi TransmitFile akan mengirimkan data file melalui soket ini. Soket yang ditentukan oleh parameter hSocket harus berupa soket berorientasi koneksi dari jenis SOCK_STREAM, SOCK_SEQPACKET, atau SOCK_RDM.

hFile

Handel ke file terbuka yang ditransmisikan oleh fungsi TransmitFile . Karena sistem operasi membaca data file secara berurutan, Anda dapat meningkatkan performa penembolokan dengan membuka handel dengan FILE_FLAG_SEQUENTIAL_SCAN.

Parameter hFile bersifat opsional. Jika parameter hFileNULL, hanya data di header dan/atau buffer ekor yang ditransmisikan. Tindakan tambahan apa pun, seperti pemutusan sambungan soket atau penggunaan kembali, dilakukan seperti yang ditentukan oleh parameter dwFlags .

nNumberOfBytesToWrite

Jumlah byte dalam file yang akan ditransmisikan. Fungsi TransmitFile selesai ketika telah mengirim jumlah byte yang ditentukan, atau ketika kesalahan terjadi, mana pun yang terjadi terlebih dahulu.

Atur parameter ini ke nol untuk mengirimkan seluruh file.

nNumberOfBytesPerSend

Ukuran, dalam byte, dari setiap blok data yang dikirim dalam setiap operasi pengiriman. Parameter ini digunakan oleh lapisan soket Windows untuk menentukan ukuran blok untuk operasi pengiriman. Untuk memilih ukuran kirim default, atur parameter ini ke nol.

Parameter nNumberOfBytesPerSend berguna untuk protokol yang memiliki batasan ukuran permintaan pengiriman individu.

lpOverlapped

Penunjuk ke struktur YANG TUMPANG TINDIH . Jika handel soket telah dibuka sebagai tumpang tindih, tentukan parameter ini untuk mencapai operasi I/O yang tumpang tindih (asinkron). Secara default, handel soket dibuka sebagai tumpang tindih.

Anda dapat menggunakan parameter lpOverlapped untuk menentukan offset 64-bit dalam file untuk memulai transfer data file dengan mengatur anggota Offset dan OffsetHigh dari struktur YANG TUMPANG TINDIH . Jika lpOverlapped adalah penunjuk NULL , transmisi data selalu dimulai pada offset byte saat ini dalam file.

Ketika lpOverlapped bukan NULL, I/O yang tumpang tindih mungkin tidak selesai sebelum TransmitFile kembali. Dalam hal ini, fungsi TransmitFile mengembalikan FALSE, dan WSAGetLastError mengembalikan ERROR_IO_PENDING atau WSA_IO_PENDING. Ini memungkinkan pemanggil untuk terus memproses saat operasi transmisi file selesai. Windows akan mengatur peristiwa yang ditentukan oleh anggota hEvent dari struktur TUMPANG TINDIH , atau soket yang ditentukan oleh hSocket, ke status yang disinyalir setelah menyelesaikan permintaan transmisi data.

lpTransmitBuffers

Penunjuk ke struktur data TRANSMIT_FILE_BUFFERS yang berisi penunjuk ke data untuk dikirim sebelum dan sesudah data file dikirim. Parameter ini harus diatur ke penunjuk NULL jika Anda hanya ingin mengirimkan data file.

dwReserved

Sekumpulan bendera yang digunakan untuk memodifikasi perilaku panggilan fungsi TransmitFile . Parameter dwFlags dapat berisi kombinasi opsi berikut yang ditentukan dalam file header Mswsock.h :

Bendera Makna
TF_DISCONNECT
Mulai pemutusan tingkat transportasi setelah semua data file diantrekan untuk transmisi.
TF_REUSE_SOCKET
Siapkan handel soket untuk digunakan kembali. Bendera ini hanya valid jika TF_DISCONNECT juga ditentukan.

Ketika permintaan TransmitFile selesai, handel soket dapat diteruskan ke panggilan fungsi yang sebelumnya digunakan untuk membuat koneksi, seperti AcceptEx atau ConnectEx. Penggunaan kembali tersebut saling eksklusif; misalnya, jika fungsi AcceptEx dipanggil untuk soket, penggunaan kembali hanya diizinkan untuk panggilan berikutnya ke fungsi AcceptEx , dan tidak diizinkan untuk panggilan berikutnya ke ConnectEx.

Catatan Pengiriman file tingkat soket tunduk pada perilaku transportasi yang mendasar. Misalnya, soket TCP dapat tunduk pada status TIME_WAIT TCP, menyebabkan panggilan TransmitFile tertunda.
 
TF_USE_DEFAULT_WORKER
Mengarahkan penyedia layanan Windows Sockets untuk menggunakan utas default sistem untuk memproses permintaan TransmitFile yang panjang. Utas default sistem dapat disesuaikan menggunakan parameter registri berikut sebagai REG_DWORD:

\ HKEY_LOCAL_MACHINECurrentControlSet\Layanan\AFD\Parameter\TransmitWorker

TF_USE_SYSTEM_THREAD
Mengarahkan penyedia layanan Windows Sockets untuk menggunakan utas sistem untuk memproses permintaan TransmitFile yang panjang.
TF_USE_KERNEL_APC
Mengarahkan driver untuk menggunakan panggilan prosedur asinkron kernel (APC) alih-alih utas pekerja untuk memproses permintaan TransmitFile yang panjang. Permintaan TransmitFile panjang didefinisikan sebagai permintaan yang memerlukan lebih dari satu bacaan dari file atau cache; oleh karena itu, permintaan tergantung pada ukuran file dan panjang paket kirim yang ditentukan.

Penggunaan TF_USE_KERNEL_APC dapat memberikan manfaat performa yang signifikan. Namun, dimungkinkan (meskipun tidak mungkin), bahwa utas di mana konteks TransmitFile dimulai digunakan untuk komputasi berat; situasi ini dapat mencegah APC diluncurkan. Perhatikan bahwa driver mode kernel Winsock menggunakan APC kernel normal, yang diluncurkan setiap kali utas dalam keadaan tunggu, yang berbeda dari APC mode pengguna, yang diluncurkan setiap kali utas dalam status tunggu yang dapat diperingatkan dimulai dalam mode pengguna).

TF_WRITE_BEHIND
Selesaikan permintaan TransmitFile segera, tanpa tertunda. Jika bendera ini ditentukan dan TransmitFile berhasil, maka data telah diterima oleh sistem tetapi belum tentu diakui oleh ujung jarak jauh. Jangan gunakan pengaturan ini dengan bendera TF_DISCONNECT dan TF_REUSE_SOCKET.
Catatan Jika file yang dikirim tidak ada dalam cache sistem file, permintaan tertunda.
 

Mengembalikan nilai

Jika fungsi TransmitFile berhasil, nilai yang dikembalikan adalah TRUE. Jika tidak, nilai yang dikembalikan adalah FALSE. Untuk mendapatkan informasi kesalahan yang diperluas, panggil WSAGetLastError. Kode kesalahan WSA_IO_PENDING atau ERROR_IO_PENDING menunjukkan bahwa operasi yang tumpang tindih telah berhasil dimulai dan penyelesaian tersebut akan ditunjukkan di lain waktu. Kode kesalahan lainnya menunjukkan bahwa operasi yang tumpang tindih tidak berhasil dimulai dan tidak ada indikasi penyelesaian yang akan terjadi. Aplikasi harus menangani ERROR_IO_PENDING atau WSA_IO_PENDING dalam hal ini.

Menampilkan kode Deskripsi
WSAECONNABORTED
Koneksi yang dibuat dibatalkan oleh perangkat lunak di komputer host Anda. Kesalahan ini dikembalikan jika sirkuit virtual dihentikan karena waktu habis atau kegagalan lainnya.
WSAECONNRESET
Koneksi yang ada ditutup secara paksa oleh host jarak jauh. Kesalahan ini dikembalikan untuk soket aliran ketika sirkuit virtual direset oleh sisi jarak jauh. Aplikasi harus menutup soket karena tidak lagi dapat digunakan.
WSAEFAULT
Sistem mendeteksi alamat penunjuk yang tidak valid dalam mencoba menggunakan argumen penunjuk dalam panggilan. Kesalahan ini dikembalikan jika parameter lpTransmitBuffers atau lpOverlapped tidak sepenuhnya terkandung dalam bagian ruang alamat pengguna yang valid.
WSAEINVAL
Argumen yang tidak valid disediakan. Kesalahan ini dikembalikan jika parameter hSocket menentukan soket jenis SOCK_DGRAM atau SOCK_RAW. Kesalahan ini dikembalikan jika parameter dwFlags memiliki set bendera TF_REUSE_SOCKET , tetapi bendera TF_DISCONNECT tidak diatur. Kesalahan ini juga dikembalikan jika offset yang ditentukan dalam struktur TUMPANG TINDIH yang diarahkan oleh lpOverlapped tidak berada dalam file. Kesalahan ini juga dikembalikan jika parameter nNumberOfBytesToWrite diatur ke nilai yang lebih besar dari 2.147.483.646, nilai maksimum untuk bilangan bulat 32-bit dikurangi 1.
WSAENETDOWN
Operasi soket mengalami jaringan mati. Kesalahan ini dikembalikan jika subsistem jaringan gagal.
WSAENETRESET
Koneksi telah terputus karena aktivitas tetap aktif mendeteksi kegagalan saat operasi sedang berlangsung.
WSAENOBUFS
Operasi pada soket tidak dapat dilakukan karena sistem tidak memiliki ruang buffer yang cukup atau karena antrean penuh. Kesalahan ini juga dikembalikan jika penyedia Windows Sockets melaporkan kebuntuan buffer.
WSAENOTCONN
Permintaan untuk mengirim atau menerima data tidak diizinkan karena soket tidak tersambung.
WSAENOTSOCK
Operasi dicoba pada sesuatu yang bukan soket. Kesalahan ini dikembalikan jika parameter hSocket bukan soket.
WSAESHUTDOWN
Permintaan untuk mengirim atau menerima data tidak diizinkan karena soket telah dimatikan ke arah tersebut dengan panggilan matikan sebelumnya. Kesalahan ini dikembalikan jika soket telah dimatikan untuk dikirim. Tidak dimungkinkan untuk memanggil TransmitFile pada soket setelah fungsi matikan dipanggil pada soket dengan bagaimana parameter diatur ke SD_SEND atau SD_BOTH.
WSANOTINITIALISED
Aplikasi belum memanggil fungsi WSAStartup , atau WSAStartup gagal. Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi TransmitFile .
WSA_IO_PENDING
Operasi I/O yang tumpang tindih sedang berlangsung. Nilai ini dikembalikan jika operasi I/O yang tumpang tindih berhasil dimulai dan menunjukkan bahwa penyelesaian akan ditunjukkan di lain waktu.
WSA_OPERATION_ABORTED
Operasi I/O telah dibatalkan karena keluarnya utas atau permintaan aplikasi. Kesalahan ini dikembalikan jika operasi yang tumpang tindih telah dibatalkan karena penutupan soket, eksekusi perintah "SIO_FLUSH" di WSAIoctl, atau utas yang memulai permintaan tumpang tindih yang keluar sebelum operasi selesai.
Catatan Semua I/O yang dimulai oleh utas tertentu dibatalkan ketika utas tersebut keluar. Untuk soket yang tumpang tindih, operasi asinkron yang tertunda dapat gagal jika utas ditutup sebelum operasi asinkron selesai. Untuk informasi selengkapnya, lihat ExitThread.
 

Keterangan

Fungsi TransmitFile menggunakan manajer cache sistem operasi untuk mengambil data file, dan menyediakan transfer data file berkinerja tinggi melalui soket.

Fungsi TransmitFile hanya mendukung soket berorientasi koneksi dari jenis SOCK_STREAM, SOCK_SEQPACKET, dan SOCK_RDM. Soket jenis SOCK_DGRAM dan SOCK_RAW tidak didukung. Fungsi TransmitPackets dapat digunakan dengan soket jenis SOCK_DGRAM.

Jumlah maksimum byte yang dapat ditransmisikan menggunakan satu panggilan ke fungsi TransmitFile adalah 2.147.483.646, nilai maksimum untuk bilangan bulat 32-bit dikurangi 1. Jumlah maksimum byte yang akan dikirim dalam satu panggilan mencakup data apa pun yang dikirim sebelum atau sesudah data file yang diarahkan oleh parameter lpTransmitBuffers ditambah nilai yang ditentukan dalam parameter nNumberOfBytesToWrite untuk panjang data file yang akan dikirim. Jika aplikasi perlu mengirimkan file yang lebih besar dari 2.147.483.646 byte, maka beberapa panggilan ke fungsi TransmitFile dapat digunakan dengan setiap panggilan mentransfer tidak lebih dari 2.147.483.646 byte. Mengatur parameter nNumberOfBytesToWrite ke nol untuk file yang lebih besar dari 2.147.483.646 byte juga akan gagal karena dalam hal ini fungsi TransmitFile akan menggunakan ukuran file sebagai nilai untuk jumlah byte yang akan dikirimkan.

Catatan Penunjuk fungsi untuk fungsi TransmitFile harus diperoleh pada durasi dengan melakukan panggilan ke fungsi WSAIoctl dengan opcode SIO_GET_EXTENSION_FUNCTION_POINTER yang ditentukan. Buffer input yang diteruskan ke fungsi WSAIoctl harus berisi WSAID_TRANSMITFILE, pengidentifikasi unik global (GUID) yang nilainya mengidentifikasi fungsi ekstensi TransmitFile . Setelah berhasil, output yang dikembalikan oleh fungsi WSAIoctl berisi penunjuk ke fungsi TransmitFile . GUID WSAID_TRANSMITFILE ditentukan dalam file header Mswsock.h .
 
CatatanTransmitFile tidak berfungsi pada transportasi yang melakukan buffering mereka sendiri. Transportasi dengan set bendera TDI_SERVICE_INTERNAL_BUFFERING, seperti ADSP, melakukan buffering mereka sendiri. Karena TransmitFile mencapai perolehan performanya dengan mengirim data langsung dari cache file. Transportasi yang kehabisan ruang buffer pada koneksi tertentu tidak ditangani oleh TransmitFile, dan sebagai akibat dari kehabisan ruang buffer pada koneksi, TransmitFile mengembalikan STATUS_DEVICE_NOT_READY.
 
Fungsi TransmitFile terutama ditambahkan ke Winsock untuk digunakan oleh aplikasi server berkinerja tinggi (server web dan ftp, misalnya).

Workstation dan versi klien Windows mengoptimalkan fungsi TransmitFile untuk memori minimum dan pemanfaatan sumber daya dengan membatasi jumlah operasi TransmitFile bersamaan yang diizinkan pada sistem hingga maksimal dua. Pada Windows Vista, Windows XP, Windows 2000 Professional, dan Windows NT Workstation 3.51 dan yang lebih baru hanya dua permintaan TransmitFile yang beredar yang ditangani secara bersamaan; permintaan ketiga akan menunggu hingga salah satu permintaan sebelumnya selesai.

Versi server Windows mengoptimalkan fungsi TransmitFile untuk performa tinggi. Pada versi server, tidak ada batas default yang ditempatkan pada jumlah operasi TransmitFile bersamaan yang diizinkan pada sistem. Harapkan hasil performa yang lebih baik saat menggunakan TransmitFile pada versi server Windows. Pada versi server Windows, dimungkinkan untuk menetapkan batas jumlah maksimum operasi TransmitFile bersamaan dengan membuat entri registri dan mengatur nilai untuk REG_DWORD berikut:

\ HKEY_LOCAL_MACHINECurrentControlSet\Layanan\AFD\Parameter\MaxActiveTransmitFileCount

Jika fungsi TransmitFile dipanggil dengan soket TCP (protokol IPPROTO_TCP) dengan bendera TF_DISCONNECT dan TF_REUSE_SOCKET yang ditentukan, panggilan tidak akan selesai sampai dua kondisi berikut terpenuhi.

  • Semua data yang tertunda yang dikirim oleh sisi jarak jauh (diterima sebelum FIN dari sisi jarak jauh) pada soket TCP telah dibaca.
  • Sisi jarak jauh telah menutup koneksi (menyelesaikan penutupan koneksi TCP yang anggun).

Jika fungsi TransmitFile dipanggil dengan parameter lpOverlapped diatur ke NULL, operasi dijalankan sebagai I/O sinkron. Fungsi tidak akan selesai sampai file dikirim.

Windows Phone 8: Fungsi ini didukung untuk aplikasi Windows Phone Store di Windows Phone 8 dan yang lebih baru.

Windows 8.1 dan Windows Server 2012 R2: Fungsi ini didukung untuk aplikasi Windows Store di Windows 8.1, Windows Server 2012 R2, dan yang lebih baru.

Catatan untuk QoS

Fungsi TransmitFile memungkinkan pengaturan dua bendera, TF_DISCONNECT atau TF_REUSE_SOCKET, yang mengembalikan soket ke status "terputus, dapat digunakan kembali" setelah file dikirimkan. Bendera ini tidak boleh digunakan pada soket di mana kualitas layanan telah diminta, karena penyedia layanan dapat segera menghapus kualitas layanan apa pun yang terkait dengan soket sebelum transfer file selesai. Pendekatan terbaik untuk soket berkemampuan QoS adalah hanya memanggil fungsi closesocket ketika transfer file telah selesai, daripada mengandalkan bendera ini.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 8.1, Windows Vista [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2003 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header mswsock.h (termasuk Mswsock.h)
Pustaka Mswsock.lib
DLL Mswsock.dll

Lihat juga

ExitThread

TUMPANG TINDIH

TRANSMIT_FILE_BUFFERS

TransmitPackets

WSASend

closesocket