Fungsi WSASocketA (winsock2.h)

Fungsi WSASocket membuat soket yang terikat dengan penyedia layanan transportasi tertentu.

Sintaks

SOCKET WSAAPI WSASocketA(
  [in] int                 af,
  [in] int                 type,
  [in] int                 protocol,
  [in] LPWSAPROTOCOL_INFOA lpProtocolInfo,
  [in] GROUP               g,
  [in] DWORD               dwFlags
);

Parameter

[in] af

Spesifikasi keluarga alamat. Nilai yang mungkin untuk keluarga alamat didefinisikan dalam file header Winsock2.h .

Pada Windows SDK yang dirilis untuk Windows Vista dan yang lebih baru, organisasi file header telah berubah dan nilai yang mungkin untuk keluarga alamat ditentukan dalam file header Ws2def.h . Perhatikan bahwa file header Ws2def.h secara otomatis disertakan dalam Winsock2.h, dan tidak boleh digunakan secara langsung.

Nilai yang saat ini didukung adalah AF_INET atau AF_INET6, yang merupakan format keluarga alamat Internet untuk IPv4 dan IPv6. Opsi lain untuk keluarga alamat (AF_NETBIOS untuk digunakan dengan NetBIOS, misalnya) didukung jika penyedia layanan Soket Windows untuk keluarga alamat diinstal. Perhatikan bahwa nilai untuk keluarga alamat AF_ dan konstanta keluarga protokol PF_ identik (misalnya, AF_INET dan PF_INET), sehingga konstanta mana pun dapat digunakan.

Tabel di bawah ini mencantumkan nilai umum untuk keluarga alamat meskipun banyak nilai lain dimungkinkan.

Af Makna
AF_UNSPEC
0
Keluarga alamat tidak ditentukan.
AF_INET
2
Keluarga alamat Protokol Internet versi 4 (IPv4).
AF_IPX
6
Keluarga alamat IPX/SPX. Keluarga alamat ini hanya didukung jika protokol Transportasi kompatibel NWLink IPX/SPX NetBIOS diinstal.

Keluarga alamat ini tidak didukung pada Windows Vista dan yang lebih baru.

AF_APPLETALK
16
Keluarga alamat AppleTalk. Keluarga alamat ini hanya didukung jika protokol AppleTalk diinstal.

Keluarga alamat ini tidak didukung pada Windows Vista dan yang lebih baru.

AF_NETBIOS
17
Keluarga alamat NetBIOS. Keluarga alamat ini hanya didukung jika penyedia Windows Sockets untuk NetBIOS diinstal.

Penyedia Soket Windows untuk NetBIOS didukung pada Windows versi 32-bit. Penyedia ini diinstal secara default pada Windows versi 32-bit.

Penyedia Windows Sockets untuk NetBIOS tidak didukung pada windows versi 64-bit termasuk Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003, atau Windows XP.

Penyedia Soket Windows untuk NetBIOS hanya mendukung soket tempat parameter jenis diatur ke SOCK_DGRAM.

Penyedia Soket Windows untuk NetBIOS tidak terkait langsung dengan antarmuka pemrograman NetBIOS . Antarmuka pemrograman NetBIOS tidak didukung pada Windows Vista, Windows Server 2008, dan yang lebih baru.

AF_INET6
23
Keluarga alamat Protokol Internet versi 6 (IPv6).
AF_IRDA
26
Keluarga alamat Asosiasi Data Inframerah (IrDA).

Keluarga alamat ini hanya didukung jika komputer memiliki port inframerah dan pengandar yang terinstal.

AF_BTH
32
Keluarga alamat Bluetooth.

Keluarga alamat ini didukung pada Windows XP dengan SP2 atau yang lebih baru jika komputer memiliki adaptor Bluetooth dan pengandar yang terinstal.

[in] type

Spesifikasi jenis untuk soket baru.

Nilai yang mungkin untuk jenis soket ditentukan dalam file header Winsock2.h .

Tabel berikut ini mencantumkan nilai yang mungkin untuk parameter jenis yang didukung untuk Windows Sockets 2:

Jenis Makna
SOCK_STREAM
1
Jenis soket yang menyediakan aliran byte berbasis koneksi berurutan, andal, dua arah, dengan mekanisme transmisi data OOB. Jenis soket ini menggunakan Protokol Kendali Transmisi (TCP) untuk keluarga alamat Internet (AF_INET atau AF_INET6).
SOCK_DGRAM
2
Jenis soket yang mendukung datagram, yang merupakan buffer tanpa koneksi dan tidak dapat diandalkan dengan panjang maksimum tetap (biasanya kecil). Jenis soket ini menggunakan Protokol Datagram Pengguna (UDP) untuk keluarga alamat Internet (AF_INET atau AF_INET6).
SOCK_RAW
3
Jenis soket yang menyediakan soket mentah yang memungkinkan aplikasi memanipulasi header protokol lapisan atas berikutnya. Untuk memanipulasi header IPv4, opsi soket IP_HDRINCL harus diatur pada soket. Untuk memanipulasi header IPv6, opsi soket IPV6_HDRINCL harus diatur pada soket.
SOCK_RDM
4
Jenis soket yang menyediakan datagram pesan yang andal. Contoh dari jenis ini adalah implementasi protokol multicast Pragmatic General Multicast (PGM) di Windows, sering disebut sebagai pemrograman multicast yang andal.

Nilai jenis ini hanya didukung jika Reliable Multicast Protocol diinstal.

SOCK_SEQPACKET
5
Jenis soket yang menyediakan paket pseudo-stream berdasarkan datagram.
 

Di Windows Sockets 2, jenis soket baru diperkenalkan. Aplikasi dapat secara dinamis menemukan atribut dari setiap protokol transportasi yang tersedia melalui fungsi WSAEnumProtocols . Jadi aplikasi dapat menentukan kemungkinan opsi jenis soket dan protokol untuk keluarga alamat dan menggunakan informasi ini saat menentukan parameter ini. Definisi jenis soket dalam file header Winsock2.h dan Ws2def.h akan diperbarui secara berkala karena jenis soket baru, keluarga alamat, dan protokol ditentukan.

Di Windows Sockets 1.1, satu-satunya jenis soket yang mungkin adalah SOCK_DGRAM dan SOCK_STREAM.

[in] protocol

Protokol yang akan digunakan. Opsi yang mungkin untuk parameter protokol khusus untuk keluarga alamat dan jenis soket yang ditentukan. Nilai yang mungkin untuk protokol didefinisikan dalam file header Winsock2.h dan Wsrm.h .

Pada Windows SDK yang dirilis untuk Windows Vista dan yang lebih baru, organisasi file header telah berubah dan parameter ini bisa menjadi salah satu nilai dari jenis enumerasi IPPROTO yang ditentukan dalam file header Ws2def.h . Perhatikan bahwa file header Ws2def.h secara otomatis disertakan dalam Winsock2.h, dan tidak boleh digunakan secara langsung.

Jika nilai 0 ditentukan, pemanggil tidak ingin menentukan protokol dan penyedia layanan akan memilih protokol yang akan digunakan.

Ketika parameter af AF_INET atau AF_INET6 dan jenisnyaSOCK_RAW, nilai yang ditentukan untuk protokol diatur dalam bidang protokol header paket IPv6 atau IPv4.

Tabel di bawah ini mencantumkan nilai umum untuk protokol meskipun banyak nilai lain yang dimungkinkan.

protokol Makna
IPPROTO_ICMP
1
Protokol Pesan Kontrol Internet (ICMP). Ini adalah nilai yang mungkin ketika parameter afAF_UNSPEC, AF_INET, atau AF_INET6 dan parameter jenisSOCK_RAW atau tidak ditentukan.

Nilai protokol ini didukung pada Windows XP dan yang lebih baru.

IPPROTO_IGMP
2
Protokol Manajemen Grup Internet (IGMP). Ini adalah nilai yang mungkin ketika parameter afAF_UNSPEC, AF_INET, atau AF_INET6 dan parameter jenisSOCK_RAW atau tidak ditentukan.

Nilai protokol ini didukung pada Windows XP dan yang lebih baru.

BTHPROTO_RFCOMM
3
Protokol Komunikasi Frekuensi Radio Bluetooth (Bluetooth RFCOMM). Ini adalah nilai yang mungkin ketika parameter afAF_BTH dan parameter jenisSOCK_STREAM.

Nilai protokol ini didukung pada Windows XP dengan SP2 atau yang lebih baru.

IPPROTO_TCP
6
Protokol Kendali Transmisi (TCP). Ini adalah nilai yang mungkin ketika parameter afAF_INET atau AF_INET6 dan parameter jenisSOCK_STREAM.
IPPROTO_UDP
17
Protokol Datagram Pengguna (UDP). Ini adalah nilai yang mungkin ketika parameter afAF_INET atau AF_INET6 dan parameter jenisSOCK_DGRAM.
IPPROTO_ICMPV6
58
Protokol Pesan Kontrol Internet Versi 6 (ICMPv6). Ini adalah nilai yang mungkin ketika parameter afAF_UNSPEC, AF_INET, atau AF_INET6 dan parameter jenisSOCK_RAW atau tidak ditentukan.

Nilai protokol ini didukung pada Windows XP dan yang lebih baru.

IPPROTO_RM
113
Protokol PGM untuk multicast yang andal. Ini adalah nilai yang mungkin ketika parameter afAF_INET dan parameter jenisSOCK_RDM. Pada Windows SDK yang dirilis untuk Windows Vista dan yang lebih baru, protokol ini juga disebut IPPROTO_PGM.

Nilai protokol ini hanya didukung jika Reliable Multicast Protocol diinstal.

[in] lpProtocolInfo

Penunjuk ke struktur WSAPROTOCOL_INFO yang menentukan karakteristik soket yang akan dibuat. Jika parameter ini bukan NULL, soket akan terikat ke penyedia yang terkait dengan struktur WSAPROTOCOL_INFO yang ditunjukkan.

[in] g

ID grup soket yang ada atau tindakan yang sesuai untuk diambil saat membuat soket baru dan grup soket baru.

Jika g adalah ID grup soket yang ada, bergabunglah dengan soket baru ke grup soket ini, asalkan semua persyaratan yang ditetapkan oleh grup ini terpenuhi.

Jika g bukan ID grup soket yang ada, maka nilai berikut dimungkinkan.

g Makna
0
Tidak ada operasi grup yang dilakukan.
SG_UNCONSTRAINED_GROUP
0x01
Buat grup soket yang tidak dibatasi dan minta soket baru menjadi anggota pertama. Untuk grup yang tidak dibatasi, Winsock tidak membatasi semua soket dalam grup soket yang telah dibuat dengan nilai yang sama untuk parameter jenis dan protokol .
SG_CONSTRAINED_GROUP
0x02
Buat grup soket yang dibatasi dan buat soket baru menjadi anggota pertama. Untuk grup soket yang dibatasi, Winsock membatasi semua soket dalam grup soket yang telah dibuat dengan nilai yang sama untuk parameter jenis dan protokol . Grup soket yang dibatasi mungkin hanya terdiri dari soket berorientasi koneksi, dan mengharuskan koneksi pada semua soket yang dikelompokkan ke alamat yang sama pada host yang sama.
 
Catatan Konstanta SG_UNCONSTRAINED_GROUP dan SG_CONSTRAINED_GROUP saat ini tidak ditentukan dalam file header publik.
 

[in] dwFlags

Sekumpulan bendera yang digunakan untuk menentukan atribut soket tambahan.

Kombinasi bendera ini dapat diatur, meskipun beberapa kombinasi tidak diizinkan.

Nilai Makna
WSA_FLAG_OVERLAPPED
0x01
Buat soket yang mendukung operasi I/O yang tumpang tindih.

Sebagian besar soket harus dibuat dengan set bendera ini. Soket yang tumpang tindih dapat menggunakan WSASend, WSASendTo, WSARecv, WSARecvFrom, dan WSAIoctl untuk operasi I/O yang tumpang tindih, yang memungkinkan beberapa operasi dimulai dan sedang berlangsung secara bersamaan.

Semua fungsi yang memungkinkan operasi yang tumpang tindih (WSASend, WSARecv, WSASendTo, WSARecvFrom, WSAIoctl) juga mendukung penggunaan yang tidak tumpang tindih pada soket yang tumpang tindih jika nilai untuk parameter yang terkait dengan operasi yang tumpang tindih adalah NULL.

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
Buat soket yang akan menjadi c_root dalam sesi multipoint.

Atribut ini hanya diperbolehkan jika struktur WSAPROTOCOL_INFO untuk penyedia transportasi yang membuat soket mendukung mekanisme multipoint atau multicast dan sarana kontrol untuk sesi multipoint berakar. Ini akan ditunjukkan oleh anggota dwServiceFlags1 dari struktur WSAPROTOCOL_INFO dengan bendera XP1_SUPPORT_MULTIPOINT dan XP1_MULTIPOINT_CONTROL_PLANE ditetapkan.

Ketika parameter lpProtocolInfo bukan NULL, struktur WSAPROTOCOL_INFO untuk penyedia transportasi ditujukkan ke oleh parameter lpProtocolInfo . Ketika parameter lpProtocolInfo adalah NULL, struktur WSAPROTOCOL_INFO didasarkan pada penyedia transportasi yang dipilih oleh nilai yang ditentukan untuk parameter af, jenis, dan protokol .

Lihat Multipoint dan Multicast Semantics untuk informasi tambahan tentang sesi multipoint.

WSA_FLAG_MULTIPOINT_C_LEAF
0x04
Buat soket yang akan menjadi c_leaf dalam sesi multipoint.

Atribut ini hanya diperbolehkan jika struktur WSAPROTOCOL_INFO untuk penyedia transportasi yang membuat soket mendukung mekanisme multipoint atau multicast dan sarana kontrol untuk sesi multipoint tidak berakar. Ini akan ditunjukkan oleh anggota dwServiceFlags1 dari struktur WSAPROTOCOL_INFO dengan set bendera XP1_SUPPORT_MULTIPOINT dan bendera XP1_MULTIPOINT_CONTROL_PLANE tidak diatur.

Ketika parameter lpProtocolInfo bukan NULL, struktur WSAPROTOCOL_INFO untuk penyedia transportasi ditujukkan ke oleh parameter lpProtocolInfo . Ketika parameter lpProtocolInfo adalah NULL, struktur WSAPROTOCOL_INFO didasarkan pada penyedia transportasi yang dipilih oleh nilai yang ditentukan untuk parameter af, jenis, dan protokol .

Lihat Multipoint dan Multicast Semantics untuk informasi tambahan tentang sesi multipoint.

WSA_FLAG_MULTIPOINT_D_ROOT
0x08
Buat soket yang akan menjadi d_root dalam sesi multipoint.

Atribut ini hanya diperbolehkan jika struktur WSAPROTOCOL_INFO untuk penyedia transportasi yang membuat soket mendukung mekanisme multipoint atau multicast dan bidang data untuk sesi multipoint di-rooting. Ini akan ditunjukkan oleh anggota dwServiceFlags1 dari struktur WSAPROTOCOL_INFO dengan bendera XP1_SUPPORT_MULTIPOINT dan XP1_MULTIPOINT_DATA_PLANE ditetapkan.

Ketika parameter lpProtocolInfo bukan NULL, struktur WSAPROTOCOL_INFO untuk penyedia transportasi ditujukkan ke oleh parameter lpProtocolInfo . Ketika parameter lpProtocolInfo adalah NULL, struktur WSAPROTOCOL_INFO didasarkan pada penyedia transportasi yang dipilih oleh nilai yang ditentukan untuk parameter af, jenis, dan protokol .

Lihat Multipoint dan Multicast Semantics untuk informasi tambahan tentang sesi multipoint.

WSA_FLAG_MULTIPOINT_D_LEAF
0x10
Buat soket yang akan menjadi d_leaf dalam sesi multipoint.

Atribut ini hanya diperbolehkan jika struktur WSAPROTOCOL_INFO untuk penyedia transportasi yang membuat soket mendukung mekanisme multipoint atau multicast dan bidang data untuk sesi multipoint tidak berakar. Ini akan ditunjukkan oleh anggota dwServiceFlags1 dari struktur WSAPROTOCOL_INFO dengan bendera XP1_SUPPORT_MULTIPOINT diatur dan bendera XP1_MULTIPOINT_DATA_PLANE tidak diatur.

Ketika parameter lpProtocolInfo bukan NULL, struktur WSAPROTOCOL_INFO untuk penyedia transportasi ditujukkan ke oleh parameter lpProtocolInfo . Ketika parameter lpProtocolInfo adalah NULL, struktur WSAPROTOCOL_INFO didasarkan pada penyedia transportasi yang dipilih oleh nilai yang ditentukan untuk parameter af, jenis, dan protokol .

Lihat Multipoint dan Multicast Semantics untuk informasi tambahan tentang sesi multipoint.

WSA_FLAG_ACCESS_SYSTEM_SECURITY
0x40
Buat soket yang memungkinkan kemampuan untuk mengatur deskriptor keamanan pada soket yang berisi daftar kontrol akses keamanan (SACL) dibandingkan dengan hanya daftar kontrol akses diskresi (DACL).

SACL digunakan untuk menghasilkan audit dan alarm ketika pemeriksaan akses terjadi pada objek. Untuk soket, pemeriksaan akses terjadi untuk menentukan apakah soket harus diizinkan untuk mengikat ke alamat tertentu yang ditentukan ke fungsi ikatan .

Hak akses ACCESS_SYSTEM_SECURITY mengontrol kemampuan untuk mendapatkan atau mengatur SACL dalam deskriptor keamanan objek. Sistem memberikan akses ini hanya tepat jika hak istimewa SE_SECURITY_NAME diaktifkan dalam token akses utas yang diminta.

WSA_FLAG_NO_HANDLE_INHERIT
0x80
Buat soket yang tidak dapat diwariskan.

Handel soket yang dibuat oleh WSASocket atau fungsi soket dapat diwariskan secara default. Ketika bendera ini diatur, handel soket tidak dapat diwariskan.

Fungsi GetHandleInformation dapat digunakan untuk menentukan apakah handel soket dibuat dengan set bendera WSA_FLAG_NO_HANDLE_INHERIT . Fungsi GetHandleInformation akan mengembalikan bahwa nilai HANDLE_FLAG_INHERIT diatur.

Bendera ini didukung pada Windows 7 dengan SP1, Windows Server 2008 R2 dengan SP1, dan yang lebih baru

 
Penting Untuk soket multipoint, hanya salah satu bendera WSA_FLAG_MULTIPOINT_C_ROOT atau WSA_FLAG_MULTIPOINT_C_LEAF yang dapat ditentukan, dan hanya salah satu bendera WSA_FLAG_MULTIPOINT_D_ROOT atau WSA_FLAG_MULTIPOINT_D_LEAF yang dapat ditentukan. Lihat Multipoint dan Multicast Semantics untuk informasi tambahan.
 

Mengembalikan nilai

Jika tidak ada kesalahan yang terjadi, WSASocket mengembalikan deskriptor yang mereferensikan soket baru. Jika tidak, nilai INVALID_SOCKET dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil WSAGetLastError.

Catatan Deskripsi kode kesalahan ini khusus Microsoft.
 
Kode kesalahan Makna
WSANOTINITIALISED
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini.
WSAENETDOWN
Subsistem jaringan gagal.
WSAEAFNOSUPPORT
Keluarga alamat yang ditentukan tidak didukung.
WSAEFAULT
Parameter lpProtocolInfo tidak berada di bagian ruang alamat proses yang valid.
WSAEINPROGRESS
Panggilan Windows Sockets 1.1 yang diblokir sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik.
WSAEINVAL
Nilai ini berlaku untuk salah satu kondisi berikut.
  • Parameter g yang ditentukan tidak valid.
  • Struktur WSAPROTOCOL_INFO yang dituju lpProtocolInfo tidak lengkap, konten tidak valid atau struktur WSAPROTOCOL_INFO telah digunakan dalam operasi soket duplikat sebelumnya.
  • Nilai yang ditentukan untuk anggota soket triple <af, jenis, dan protokol> didukung secara individual, tetapi kombinasi yang diberikan tidak.
WSAEINVALIDPROVIDER
Penyedia layanan mengembalikan versi selain 2.2.
WSAEINVALIDPROCTABLE
Penyedia layanan mengembalikan tabel prosedur yang tidak valid atau tidak lengkap ke WSPStartup.
WSAEMFILE
Tidak ada lagi deskriptor soket yang tersedia.
WSAENOBUFS
Tidak ada ruang buffer yang tersedia. Soket tidak dapat dibuat.
WSAEPROTONOSUPPORT
Protokol yang ditentukan tidak didukung.
WSAEPROTOTYPE
Protokol yang ditentukan adalah tipe yang salah untuk soket ini.
WSAEPROVIDERFAILEDINIT
Penyedia layanan gagal menginisialisasi. Kesalahan ini dikembalikan jika penyedia layanan berlapis (LSP) atau penyedia namespace tidak diinstal dengan benar atau penyedia gagal beroperasi dengan benar.
WSAESOCKTNOSUPPORT
Jenis soket yang ditentukan tidak didukung dalam keluarga alamat ini.

Keterangan

Fungsi WSASocket menyebabkan pendeskripsi soket dan sumber daya terkait dialokasikan dan dikaitkan dengan penyedia layanan transportasi. Sebagian besar soket harus dibuat dengan atribut WSA_FLAG_OVERLAPPED yang diatur dalam parameter dwFlags . Soket yang dibuat dengan atribut ini mendukung penggunaan operasi I/O yang tumpang tindih yang memberikan performa lebih tinggi. Secara default, soket yang dibuat dengan fungsi WSASocket tidak akan memiliki set atribut yang tumpang tindih ini. Sebaliknya, fungsi soket membuat soket yang mendukung operasi I/O yang tumpang tindih sebagai perilaku default.

Jika parameter lpProtocolInfo adalah NULL, Winsock akan menggunakan penyedia layanan transportasi pertama yang tersedia yang mendukung kombinasi keluarga alamat, jenis soket, dan protokol yang diminta yang ditentukan dalam parameter af, jenis, dan protokol .

Jika parameter lpProtocolInfo bukan NULL, soket akan terikat ke penyedia yang terkait dengan struktur WSAPROTOCOL_INFO yang ditunjukkan. Dalam hal ini, aplikasi dapat menyediakan konstanta manifes FROM_PROTOCOL_INFO sebagai nilai untuk salah satu parameter af, jenis, atau protokol . Ini menunjukkan bahwa nilai yang sesuai dari struktur WSAPROTOCOL_INFO yang ditunjukkan (iAddressFamily, iSocketType, iProtocol) akan diasumsikan. Bagaimanapun, nilai yang ditentukan untuk af, jenis, dan protokol diteruskan tanpa diubah ke penyedia layanan transportasi.

Saat memilih protokol dan penyedia layanan pendukungnya berdasarkan af, jenis, dan protokol, prosedur ini hanya akan memilih protokol dasar atau rantai protokol, bukan lapisan protokol dengan sendirinya. Lapisan protokol yang tidak terikat tidak dianggap memiliki kecocokan parsial pada jenis atau af. Artinya, mereka tidak mengarah ke kode kesalahan WSAEAFNOSUPPORT atau WSAEPROTONOSUPPORT, jika tidak ada protokol yang cocok yang ditemukan.

Catatan Konstanta manifes AF_UNSPEC terus didefinisikan dalam file header tetapi penggunaannya sangat tidak disarankan, karena ini dapat menyebabkan ambiguitas dalam menafsirkan nilai parameter protokol .
 
Aplikasi didorong untuk menggunakan AF_INET6 untuk parameter af dan membuat soket mode ganda yang dapat digunakan dengan IPv4 dan IPv6.

Jika soket dibuat menggunakan fungsi WSASocket , parameter dwFlags harus memiliki atribut WSA_FLAG_OVERLAPPED yang diatur agar opsi soket SO_RCVTIMEO atau SO_SNDTIMEO berfungsi dengan baik. Jika tidak, batas waktu tidak pernah berlaku pada soket.

Soket berorientasi koneksi seperti SOCK_STREAM menyediakan koneksi dupleks penuh, dan harus dalam keadaan tersambung sebelum data apa pun dapat dikirim atau diterima di dalamnya. Koneksi ke soket tertentu dibuat dengan panggilan fungsi sambungkan atau WSAConnect . Setelah tersambung, data dapat ditransfer menggunakan panggilanWSASend/ dan recv/WSARecv. Ketika sesi telah selesai, fungsi closesocket harus dipanggil untuk merilis sumber daya yang terkait dengan soket. Untuk soket berorientasi koneksi, fungsi matikan harus dipanggil untuk menghentikan transfer data pada soket sebelum memanggil fungsi closesocket .

Protokol komunikasi yang digunakan untuk mengimplementasikan soket yang andal dan berorientasi koneksi memastikan bahwa data tidak hilang atau diduplikasi. Jika data yang protokol serekannya memiliki ruang buffer tidak dapat berhasil ditransmisikan dalam jangka waktu yang wajar, koneksi dianggap rusak dan panggilan berikutnya akan gagal dengan kode kesalahan yang diatur ke WSAETIMEDOUT.

Soket tanpa koneksi berorientasi pesan memungkinkan pengiriman dan penerimaan datagram ke dan dari serekan arbitrer menggunakan sendto/WSASendTo dan recvfrom/WSARecvFrom. Jika soket seperti itu terhubung ke peer tertentu, datagram dapat dikirim ke peer tersebut menggunakan kirim/WSASend dan dapat diterima dari (hanya) peer ini menggunakan recv/WSARecv.

Dukungan untuk soket dengan jenis SOCK_RAW tidak diperlukan, tetapi penyedia layanan didorong untuk mendukung soket mentah jika memungkinkan.

Fungsi WSASocket dapat digunakan untuk membuat soket untuk digunakan oleh layanan sehingga jika soket lain mencoba mengikat ke port yang sama yang digunakan oleh layanan, catatan audit dihasilkan. Untuk mengaktifkan opsi ini, aplikasi harus melakukan hal berikut:

  • Panggil fungsi AdjustTokenPrivileges untuk mengaktifkan hak istimewa SE_SECURITY_NAME dalam token akses untuk proses tersebut. Hak istimewa ini diperlukan untuk mengatur hak akses ACCESS_SYSTEM_SECURITY pada deskriptor keamanan untuk objek.
  • Panggil fungsi WSASocket untuk membuat soket dengan dwFlag dengan opsi WSA_FLAG_ACCESS_SYSTEM_SECURITY diatur. Fungsi WSASocket akan gagal jika fungsi AdjustTokenPrivileges tidak dipanggil terlebih dahulu untuk mengaktifkan hak istimewa SE_SECURITY_NAME yang diperlukan untuk operasi ini.
  • Panggil fungsi SetSecurityInfo untuk mengatur deskriptor keamanan dengan System Access Control List (SACL) pada soket. Handel soket yang dikembalikan oleh fungsi WSASocket diteruskan dalam parameter handel . Jika fungsi berhasil, ini akan mengatur akses ACCESS_SYSTEM_SECURITY langsung pada deskriptor keamanan untuk soket.
  • Panggil fungsi pengikatan untuk mengikat soket ke port tertentu. Jika fungsi ikat berhasil, maka entri audit dihasilkan jika soket lain mencoba mengikat ke port yang sama.
  • Panggil fungsi AdjustTokenPrivileges untuk menghapus hak istimewa SE_SECURITY_NAME dalam token akses untuk proses tersebut, karena ini tidak lagi diperlukan.

Untuk informasi selengkapnya tentang ACCESS_SYSTEM_SECURITY, lihat Hak Akses SACL dan Pembuatan Audit dalam dokumentasi Otorisasi.

Grup Soket

WinSock 2 memperkenalkan gagasan grup soket sebagai sarana untuk aplikasi, atau set aplikasi yang bekerja sama, untuk menunjukkan kepada penyedia layanan yang mendasar bahwa sekumpulan soket tertentu terkait dan bahwa grup yang dibentuk dengan demikian memiliki atribut tertentu. Atribut grup mencakup prioritas relatif soket individu dalam grup dan kualitas grup spesifikasi layanan.

Aplikasi yang perlu bertukar aliran multimedia melalui jaringan adalah contoh di mana mampu membangun hubungan tertentu di antara satu set soket bisa bermanfaat. Terserah transportasi tentang cara mengobati grup soket.

Fungsi WSASocket dan WSAAccept dapat digunakan untuk secara eksplisit membuat dan bergabung dengan grup soket saat membuat soket baru. ID grup soket untuk soket dapat diambil dengan menggunakan fungsi getsockopt dengan parameter tingkat diatur ke SOL_SOCKET dan parameter optname diatur ke SO_GROUP_ID. Grup soket dan ID grup soket terkait tetap valid hingga soket terakhir milik grup soket ini ditutup. ID grup soket unik di semua proses untuk penyedia layanan tertentu. Grup soket nol menunjukkan bahwa soket bukan anggota grup soket.

Prioritas grup relatif dari grup soket dapat diakses dengan menggunakan fungsi getsockopt dengan parameter tingkat yang diatur ke SOL_SOCKET dan parameter optname diatur ke SO_GROUP_PRIORITY. Prioritas grup relatif dari grup soket dapat diatur dengan menggunakan setsockopt dengan parameter tingkat yang diatur ke SOL_SOCKET dan parameter optname diatur ke SO_GROUP_PRIORITY.

Penyedia Winsock yang disertakan dengan Windows memungkinkan pembuatan grup soket dan memberlakukan SG_CONSTRAINED_GROUP. Semua soket dalam grup soket yang dibatasi harus dibuat dengan nilai yang sama untuk parameter jenis dan protokol . Grup soket yang dibatasi mungkin hanya terdiri dari soket berorientasi koneksi, dan mengharuskan koneksi pada semua soket yang dikelompokkan ke alamat yang sama pada host yang sama. Ini adalah satu-satunya pembatasan yang diterapkan ke grup soket oleh penyedia Winsock yang disertakan dengan Windows. Prioritas grup soket saat ini tidak digunakan oleh penyedia Winsock atau tumpukan TCP/IP yang disertakan dengan Windows.

Contoh Kode

Contoh berikut menunjukkan penggunaan fungsi WSASocket .
#ifndef UNICODE
#define UNICODE 1
#endif

// link with Ws2_32.lib
#pragma comment(lib,"Ws2_32.lib")

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


int __cdecl wmain(int argc, wchar_t **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData = {0};
    int iResult = 0;

//    int i = 1;

    SOCKET sock = INVALID_SOCKET;
    int iFamily = AF_UNSPEC;
    int iType = 0;
    int iProtocol = 0;
    DWORD dwFlags = 0;

    // Validate the parameters
    if (argc != 5) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol> <flags>\n", argv[0]);
        wprintf(L"       opens a socket for the specified family, type, protocol, and flags\n");
        wprintf(L"       flags value must be in decimal, not hex\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17 1\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17 OVERLAPPED\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    dwFlags = _wtoi(argv[4]);
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    wprintf(L"Calling socket with following parameters:\n");
    wprintf(L"  Address Family = ");
    switch (iFamily) {
    case AF_UNSPEC:
        wprintf(L"Unspecified");
        break;
    case AF_INET:
        wprintf(L"AF_INET (IPv4)");
        break;
    case AF_INET6:
        wprintf(L"AF_INET6 (IPv6)");
        break;
    case AF_NETBIOS:
        wprintf(L"AF_NETBIOS (NetBIOS)");
        break;
    case AF_BTH:
        wprintf(L"AF_BTH (Bluetooth)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iFamily);
    
    wprintf(L"  Socket type = ");
    switch (iType) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case SOCK_STREAM:
        wprintf(L"SOCK_STREAM (stream)");
        break;
    case SOCK_DGRAM:
        wprintf(L"SOCK_DGRAM (datagram)");
        break;
    case SOCK_RAW:
        wprintf(L"SOCK_RAW (raw)");
        break;
    case SOCK_RDM:
        wprintf(L"SOCK_RDM (reliable message datagram)");
        break;
    case SOCK_SEQPACKET:
        wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iType);

    wprintf(L"  Protocol = %d = ", iProtocol);
    switch (iProtocol) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case IPPROTO_ICMP:
        wprintf(L"IPPROTO_ICMP (ICMP)");
        break;
    case IPPROTO_IGMP:
        wprintf(L"IPPROTO_IGMP (IGMP)");
        break;
    case IPPROTO_TCP:
        wprintf(L"IPPROTO_TCP (TCP)");
        break;
    case IPPROTO_UDP:
        wprintf(L"IPPROTO_UDP (UDP)");
        break;
    case IPPROTO_ICMPV6:
        wprintf(L"IPPROTO_ICMPV6 (ICMP Version 6)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iProtocol);

    wprintf(L"  Flags = ");
    if (dwFlags & WSA_FLAG_OVERLAPPED)
        wprintf(L"  WSA_FLAG_OVERLAPPED");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_LEAF");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_LEAF");
    if (dwFlags & WSA_FLAG_ACCESS_SYSTEM_SECURITY)
        wprintf(L"  WSA_FLAG_ACCESS_SYSTEM_SECURITY");
#ifdef WSA_FLAG_NO_HANDLE_INHERIT 
    if (dwFlags & WSA_FLAG_NO_HANDLE_INHERIT)
        wprintf(L"  WSA_FLAG_NO_HANDLE_INHERIT");
#endif
    wprintf(L" (0x%x)\n" , dwFlags);

    sock = WSASocket(iFamily, iType, iProtocol, NULL, 0, dwFlags);
    if (sock == INVALID_SOCKET) 
        wprintf(L"WSASocket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"WSASocket function succeeded\n");

        // Close the socket to release the resources associated
        // Normally an application calls shutdown() before closesocket 
        //   to  disables sends or receives on a socket first
        // This isn't needed in this simple sample
        iResult = closesocket(sock);
        if (iResult == SOCKET_ERROR) {
            wprintf(L"closesocket function zfailed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }
    WSACleanup();

    return 0;
}


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

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

Catatan

Header winsock2.h mendefinisikan WSASocket sebagai alias yang secara otomatis memilih versi ANSI atau Unicode dari fungsi ini berdasarkan definisi konstanta pra-prosesor UNICODE. Mencampur penggunaan alias encoding-netral dengan kode yang tidak mengodekan-netral dapat menyebabkan ketidakcocokan yang mengakibatkan kesalahan kompilasi atau runtime. Untuk informasi selengkapnya, lihat Konvensi untuk Prototipe Fungsi.

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 winsock2.h
Pustaka Ws2_32.lib
DLL Ws2_32.dll

Lihat juga

WSAPROTOCOL_INFO

Fungsi Winsock

Referensi Winsock

Menerima

Mengikat

closesocket

sambungkan

getsockname

getsockopt

ioctlsocket

Mendengarkan

recv

recvfrom

pilih

Mengirim

kirim ke

setsockopt

Shutdown

soket