Bagikan melalui


fungsi soket (winsock2.h)

Fungsi soket membuat soket yang terikat ke penyedia layanan transportasi tertentu.

Sintaks

SOCKET WSAAPI socket(
  [in] int af,
  [in] int type,
  [in] int protocol
);

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.

Nilai kembali

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

Kode kesalahan Makna
WSANOTINITIALISED
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini.
WSAENETDOWN
Subsistem jaringan atau penyedia layanan terkait gagal.
WSAEAFNOSUPPORT
Keluarga alamat yang ditentukan tidak didukung. Misalnya, aplikasi mencoba membuat soket untuk keluarga alamat AF_IRDA tetapi adaptor inframerah dan driver perangkat tidak diinstal pada komputer lokal.
WSAEINPROGRESS
Panggilan Windows Sockets 1.1 yang diblokir sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik.
WSAEMFILE
Tidak ada lagi deskriptor soket yang tersedia.
WSAEINVAL
Argumen yang tidak valid disediakan. Kesalahan ini dikembalikan jika parameter af diatur ke AF_UNSPEC dan parameter jenis dan protokol tidak ditentukan.
WSAEINVALIDPROVIDER
Penyedia layanan mengembalikan versi selain 2.2.
WSAEINVALIDPROCTABLE
Penyedia layanan mengembalikan tabel prosedur yang tidak valid atau tidak lengkap ke WSPStartup.
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 soket menyebabkan deskriptor soket dan sumber daya terkait dialokasikan dan terikat ke penyedia layanan transportasi tertentu. Winsock akan menggunakan penyedia layanan pertama yang tersedia yang mendukung kombinasi keluarga alamat, jenis soket, dan parameter protokol yang diminta. Soket yang dibuat akan memiliki atribut yang tumpang tindih sebagai default. Untuk Windows, opsi soket khusus Microsoft, SO_OPENTYPE, yang ditentukan dalam Mswsock.h dapat memengaruhi default ini. Lihat Dokumentasi khusus Microsoft untuk deskripsi terperinci tentang SO_OPENTYPE.

Soket tanpa atribut yang tumpang tindih dapat dibuat dengan menggunakan WSASocket. Semua fungsi yang memungkinkan operasi yang tumpang tindih (WSASend, WSARecv, WSASendTo, WSARecvFrom, dan 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.

Ketika memilih protokol dan penyedia layanan pendukungnya, 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 menyebabkan 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.

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 lain dibuat dengan panggilan sambungkan . Setelah tersambung, data dapat ditransfer menggunakan panggilan kirim dan rekv . Ketika sesi telah selesai, closesocket harus dilakukan.

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 dan berorientasi pesan memungkinkan pengiriman dan penerimaan datagram ke dan dari serekan arbitrer menggunakan sendto dan recvfrom. Jika soket seperti itu tersambung ke serekan tertentu, datagram dapat dikirim ke serekan tersebut menggunakan kirim dan hanya dapat diterima dari rekan ini menggunakan recv.

IPv6 dan IPv4 beroperasi secara berbeda saat menerima soket dengan jenisSOCK_RAW. Paket penerima IPv4 mencakup payload paket, header tingkat atas berikutnya (misalnya, header IP untuk paket TCP atau UDP), dan header paket IPv4. Paket penerima IPv6 mencakup payload paket dan header tingkat atas berikutnya. Paket penerima IPv6 tidak pernah menyertakan header paket IPv6.

Catatan Pada Windows NT, dukungan soket mentah memerlukan hak istimewa admin.
 
Soket dengan parameter jenisSOCK_SEQPACKET didasarkan pada datagram, tetapi berfungsi sebagai protokol aliran semu. Untuk paket kirim dan terima, datagram terpisah digunakan. Namun, Windows Sockets dapat menggabungkan beberapa paket penerima ke dalam satu paket. Jadi aplikasi dapat mengeluarkan panggilan terima (misalnya, recv atau WSARecvEx) dan mengambil data dari beberapa paket yang digabungkan dalam satu panggilan. Keluarga alamat AF_NETBIOS mendukung parameter jenisSOCK_SEQPACKET.

Ketika parameter afAF_NETBIOS untuk NetBIOS melalui TCP/IP, parameter jenis dapat SOCK_DGRAM atau SOCK_SEQPACKET. Untuk keluarga alamat AF_NETBIOS , parameter protokol adalah nomor adaptor LAN yang dinyatakan sebagai angka negatif.

Pada Windows XP dan yang lebih baru, perintah berikut dapat digunakan untuk mencantumkan katalog Soket Windows untuk menentukan penyedia layanan yang diinstal dan keluarga alamat, jenis soket, dan protokol yang didukung.

netsh winsock menunjukkan katalog

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

Catatan untuk Soket IrDA

Ingatlah hal-hal berikut ini:
  • File header Af_irda.h harus disertakan secara eksplisit.
  • Hanya SOCK_STREAM yang didukung; jenis SOCK_DGRAM tidak didukung oleh IrDA.
  • Parameter protokol selalu diatur ke 0 untuk IrDA.
Soket untuk digunakan dengan keluarga alamat AF_IRDA hanya dapat dibuat jika komputer lokal menginstal port inframerah dan driver. Jika tidak, panggilan ke fungsi soket dengan parameter af yang diatur ke AF_IRDA akan gagal dan WSAGetLastError mengembalikan WSAEPROTONOSUPPORT.

Contoh Kode

Contoh berikut menunjukkan penggunaan fungsi soket untuk membuat soket yang terikat dengan penyedia layanan transportasi tertentu..
#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;

    // Validate the parameters
    if (argc != 4) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol>\n", argv[0]);
        wprintf(L"socket opens a socket for the specified family, type, & protocol\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    
    // 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);

    sock = socket(iFamily, iType, iProtocol);
    if (sock == INVALID_SOCKET) 
        wprintf(L"socket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"socket 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 failed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }

    WSACleanup();

    return 0;
}


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.

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

Opsi Soket IPPROTO_IP

Opsi Soket IPPROTO_IPV6

Pemrograman Multicast yang Andal

WSASocket

Fungsi Winsock

Referensi Winsock

Menerima

Mengikat

closesocket

sambungkan

getsockname

getsockopt

ioctlsocket

Mendengarkan

recv

recvfrom

pilih

Mengirim

kirim ke

setsockopt

Shutdown