Fungsi WSASocketW (winsock2.h)
Fungsi WSASocket membuat soket yang terikat dengan penyedia layanan transportasi tertentu.
Sintaks
SOCKET WSAAPI WSASocketW(
[in] int af,
[in] int type,
[in] int protocol,
[in] LPWSAPROTOCOL_INFOW 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 dapat digunakan.
Tabel di bawah ini mencantumkan nilai umum untuk keluarga alamat meskipun banyak nilai lain dimungkinkan.
Af | Makna |
---|---|
|
Keluarga alamat tidak ditentukan. |
|
Keluarga alamat Protokol Internet versi 4 (IPv4). |
|
Keluarga alamat IPX/SPX. Keluarga alamat ini hanya didukung jika protokol Transport yang Kompatibel dengan NWLink IPX/SPX NetBIOS diinstal.
Keluarga alamat ini tidak didukung pada Windows Vista dan yang lebih baru. |
|
Keluarga alamat AppleTalk. Keluarga alamat ini hanya didukung jika protokol AppleTalk diinstal.
Keluarga alamat ini tidak didukung pada Windows Vista dan yang lebih baru. |
|
Keluarga alamat NetBIOS. Keluarga alamat ini hanya didukung jika penyedia Windows Sockets untuk NetBIOS diinstal.
Penyedia Windows Sockets 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. |
|
Keluarga alamat Protokol Internet versi 6 (IPv6). |
|
Keluarga alamat Asosiasi Data Inframerah (IrDA).
Keluarga alamat ini hanya didukung jika komputer memiliki port inframerah dan pengandar yang terinstal. |
|
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 mencantumkan nilai yang mungkin untuk parameter jenis yang didukung untuk Windows Sockets 2:
Jenis | Makna |
---|---|
|
Jenis soket yang menyediakan aliran byte berbasis koneksi berurutan, andal, dua arah, dengan mekanisme transmisi data OOB. Jenis soket ini menggunakan Protokol Kontrol Transmisi (TCP) untuk keluarga alamat Internet (AF_INET atau AF_INET6). |
|
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). |
|
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. |
|
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. |
|
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 didefinisikan.
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 ditentukan 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 dapat 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 dimungkinkan.
[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.
[in] dwFlags
Sekumpulan bendera yang digunakan untuk menentukan atribut soket tambahan.
Kombinasi bendera ini dapat diatur, meskipun beberapa kombinasi tidak diizinkan.
Nilai | Makna |
---|---|
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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 |
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.
Kode kesalahan | Makna |
---|---|
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini. | |
Subsistem jaringan gagal. | |
Keluarga alamat yang ditentukan tidak didukung. | |
Parameter lpProtocolInfo tidak berada di bagian ruang alamat proses yang valid. | |
Panggilan Windows Sockets 1.1 yang diblokir sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik. | |
Nilai ini berlaku untuk salah satu kondisi berikut.
|
|
Penyedia layanan mengembalikan versi selain 2.2. | |
Penyedia layanan mengembalikan tabel prosedur yang tidak valid atau tidak lengkap ke WSPStartup. | |
Tidak ada lagi deskriptor soket yang tersedia. | |
Tidak ada ruang buffer yang tersedia. Soket tidak dapat dibuat. | |
Protokol yang ditentukan tidak didukung. | |
Protokol yang ditentukan adalah tipe yang salah untuk soket ini. | |
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. | |
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.
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, dan 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 |