Bagikan melalui


fungsi getsockopt (winsock.h)

Fungsi getsockopt mengambil opsi soket.

Sintaks

int getsockopt(
  [in]      SOCKET s,
  [in]      int    level,
  [in]      int    optname,
  [out]     char   *optval,
  [in, out] int    *optlen
);

Parameter

[in] s

Deskriptor yang mengidentifikasi soket.

[in] level

Tingkat di mana opsi ditentukan. Contoh: SOL_SOCKET.

[in] optname

Opsi soket tempat nilai akan diambil. Contoh: SO_ACCEPTCONN. Nilai optname harus merupakan opsi soket yang ditentukan dalam tingkat yang ditentukan, atau perilaku tidak terdefinisi.

[out] optval

Penunjuk ke buffer tempat nilai untuk opsi yang diminta akan dikembalikan.

[in, out] optlen

Penunjuk ke ukuran, dalam byte, dari buffer optval .

Mengembalikan nilai

Jika tidak ada kesalahan yang terjadi, getsockopt mengembalikan nol. Jika tidak, nilai SOCKET_ERROR 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
Catatan Subsistem jaringan gagal.
 
WSAEFAULT
Salah satu optval atau parameter optlen bukan bagian yang valid dari ruang alamat pengguna, atau parameter optlen terlalu kecil.
WSAEINPROGRESS
Pemblokiran panggilan Windows Sockets 1.1 sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik.
WSAEINVAL
Parameter tingkat tidak diketahui atau tidak valid.
WSAENOPROTOOPT
Opsi tidak diketahui atau tidak didukung oleh keluarga protokol yang ditunjukkan.
WSAENOTSOCK
Deskriptor bukan soket.

Keterangan

Fungsi getsockopt mengambil nilai saat ini untuk opsi soket yang terkait dengan soket jenis apa pun, dalam status apa pun, dan menyimpan hasilnya dalam optval. Opsi dapat ada di beberapa tingkat protokol, tetapi selalu ada di tingkat soket paling atas. Opsi memengaruhi operasi soket, seperti perutean paket dan transfer data OOB.

Nilai yang terkait dengan opsi yang dipilih dikembalikan dalam optval buffer. Bilangan bulat yang diarahkan oleh optlen awalnya harus berisi ukuran buffer ini; saat dikembalikan, itu akan diatur ke ukuran nilai yang dikembalikan. Untuk SO_LINGER, ini akan menjadi ukuran struktur LINGER . Untuk sebagian besar opsi lainnya, itu akan menjadi ukuran bilangan bulat.

Aplikasi bertanggung jawab untuk mengalokasikan ruang memori apa pun yang diarahkan ke secara langsung atau tidak langsung oleh salah satu parameter yang ditentukannya.

Jika opsi tidak pernah diatur dengan setsockopt, maka getsockopt mengembalikan nilai default untuk opsi tersebut.

Opsi berikut didukung untuk getsockopt. Kolom Jenis mengidentifikasi jenis data yang ditangani berdasarkan optval.

Untuk informasi selengkapnya tentang opsi soket, lihat Opsi Soket.

Tabel nilai berikut untuk parameter optname valid saat parameter tingkat diatur ke SOL_SOCKET.

Nilai Jenis Makna
SO_ACCEPTCONN BOOL Soket mendengarkan.
SO_BROADCAST BOOL Soket dikonfigurasi untuk transmisi dan penerimaan pesan siaran.
SO_BSP_STATE CSADDR_INFO Mengembalikan alamat lokal, port lokal, alamat jarak jauh, port jarak jauh, jenis soket, dan protokol yang digunakan oleh soket.
SO_CONDITIONAL_ACCEPT BOOL Mengembalikan status soket saat ini, baik dari panggilan sebelumnya ke setsockopt atau default sistem.
SO_CONNECT_TIME DWORD Mengembalikan jumlah detik yang telah disambungkan oleh soket. Opsi soket ini hanya berlaku untuk protokol berorientasi koneksi.
SO_DEBUG BOOL Penelusuran kesalahan diaktifkan.
SO_DONTLINGER BOOL Jika TRUE, opsi SO_LINGER dinonaktifkan.
SO_DONTROUTE BOOL Perutean dinonaktifkan. Pengaturan ini berhasil tetapi diabaikan pada soket AF_INET; gagal pada soket AF_INET6 dengan WSAENOPROTOOPT. Opsi ini tidak didukung pada soket ATM.
SO_ERROR int Mengambil status kesalahan dan menghapus.
SO_EXCLUSIVEADDRUSE BOOL Mencegah soket lain mengikat ke alamat dan port yang sama. Opsi ini harus diatur sebelum memanggil fungsi ikatan .
SO_GROUP_ID GROUP Dicadangkan.
SO_GROUP_PRIORITY int Dicadangkan.
SO_KEEPALIVE BOOL Tetap hidup sedang dikirim. Tidak didukung pada soket ATM.
SO_LINGER Struktur LINGER Mengembalikan opsi linger saat ini.
SO_MAX_MSG_SIZE int tidak bertanda Ukuran maksimum pesan untuk jenis soket berorientasi pesan (misalnya, SOCK_DGRAM). Tidak memiliki arti untuk soket berorientasi aliran.
SO_OOBINLINE BOOL Data OOB sedang diterima di aliran data normal. (Lihat bagian Rutinitas Pemblokiran Windows Sockets 1.1 dan EINPROGRESS untuk diskusi tentang topik ini.)
SO_PORT_SCALABILITY BOOL Memungkinkan skalabilitas port lokal untuk soket dengan memungkinkan alokasi port dimaksimalkan dengan mengalokasikan port wildcard beberapa kali untuk pasangan port alamat lokal yang berbeda pada komputer lokal.
SO_PROTOCOL_INFO WSAPROTOCOL_INFO Deskripsi informasi protokol untuk protokol yang terikat ke soket ini.
SO_RCVBUF int Total ruang buffer per soket yang disediakan untuk penerimaan. Ini tidak terkait dengan SO_MAX_MSG_SIZE dan tidak selalu sesuai dengan ukuran jendela penerima TCP.
SO_REUSEADDR BOOL Soket dapat terikat ke alamat yang sudah digunakan. Tidak berlaku untuk soket ATM.
SO_SNDBUF int Total ruang buffer per soket yang disediakan untuk pengiriman. Ini tidak terkait dengan SO_MAX_MSG_SIZE dan tidak selalu sesuai dengan ukuran jendela pengiriman TCP.
SO_TYPE int Jenis soket (misalnya, SOCK_STREAM).
PVD_CONFIG Dependen Penyedia Layanan Objek struktur data buram dari penyedia layanan yang terkait dengan soket. Objek ini menyimpan informasi konfigurasi penyedia layanan saat ini. Format yang tepat dari struktur data ini khusus untuk penyedia layanan.
 

Tingkat = IPPROTO_TCP

Lihat TCP_NODELAY dalam opsi soket IPPROTO_TCP. Lihat juga topik tersebut untuk informasi yang lebih lengkap dan terperinci tentang opsi soket untuk tingkat = IPPROTO_TCP.  

Tabel nilai berikut untuk parameter optname valid saat parameter tingkat diatur ke NSPROTO_IPX.

Catatan Windows NT mendukung semua opsi IPX. Windows Me, Windows 98, dan Windows 95 hanya mendukung opsi berikut:
IPX_PTYPE
IPX_FILTERPTYPE
IPX_DSTYPE
IPX_RECVHDR
IPX_MAXSIZE
IPX_ADDRESS
 
Nilai Jenis Makna
IPX_PTYPE int Mengambil jenis paket IPX.
IPX_FILTERPTYPE int Mengambil jenis paket filter terima
IPX_DSTYPE int Mendapatkan nilai bidang aliran data di header SPX pada setiap paket yang dikirim.
IPX_EXTENDED_ADDRESS BOOL Mencari tahu apakah alamat yang diperluas diaktifkan.
IPX_RECVHDR BOOL Mencari tahu apakah header protokol dikirim pada semua header penerima.
IPX_MAXSIZE int Mendapatkan ukuran data maksimum yang dapat dikirim.
IPX_ADDRESS struktur IPX_ADDRESS_DATA Mendapatkan informasi tentang adaptor tertentu yang terikat IPX. Penomoran adaptor adalah nol dasar. Anggota adapternum diisi saat kembali.
IPX_GETNETINFO struktur IPX_NETNUM_DATA Mendapatkan informasi tentang nomor jaringan IPX tertentu. Jika tidak tersedia di cache, gunakan RIP untuk mendapatkan informasi.
IPX_GETNETINFO_NORIP struktur IPX_NETNUM_DATA Mendapatkan informasi tentang nomor jaringan IPX tertentu. Jika tidak tersedia di cache, tidak akan menggunakan RIP untuk mendapatkan informasi, dan mengembalikan kesalahan.
IPX_SPXGETCONNECTIONSTATUS struktur IPX_SPXCONNSTATUS_DATA Mengambil informasi tentang soket SPX yang tersambung.
IPX_ADDRESS_NOTIFY struktur IPX_ADDRESS_DATA Mengambil pemberitahuan status ketika perubahan terjadi pada adaptor di mana IPX terikat.
IPX_MAX_ADAPTER_NUM int Mengambil jumlah maksimum adaptor yang ada, bernomor sebagai nol dasar.
IPX_RERIPNETNUMBER struktur IPX_NETNUM_DATA Mirip dengan IPX_GETNETINFO, tetapi memaksa IPX untuk menggunakan RIP untuk resolusi, bahkan jika informasi jaringan ada di cache lokal.
IPX_IMMEDIATESPXACK BOOL Mengarahkan koneksi SPX untuk tidak menunda sebelum mengirim ACK. Aplikasi tanpa lalu lintas bolak-balik harus mengatur ini ke TRUE untuk meningkatkan performa.
TCP_MAXSEG int Menerima ukuran segmen maksimum TCP. Didukung dalam versi Windows 10 dan yang lebih baru.
 

Tabel berikut mencantumkan nilai untuk optname yang mewakili opsi soket BSD yang tidak didukung oleh fungsi getsockopt .

Nilai Jenis Makna
SO_RCVLOWAT int Menerima marka air rendah.
SO_RCVTIMEO int Menerima waktu habis.
SO_SNDLOWAT int Mengirim marka air rendah.
SO_SNDTIMEO int Mengirim waktu habis.
TCP_MAXSEG int Menerima ukuran segmen maksimum TCP. Tidak didukung dalam versi sebelum Windows 10.
 
Catatan Saat menggunakan fungsi recv , jika tidak ada data yang tiba selama periode yang ditentukan dalam SO_RCVTIMEO, fungsi recv selesai. Dalam versi Windows sebelum Windows 2000, data apa pun yang diterima kemudian gagal dengan WSAETIMEDOUT. Di Windows 2000 dan yang lebih baru, jika tidak ada data yang tiba dalam periode yang ditentukan dalam SO_RCVTIMEO, fungsi recv mengembalikan WSAETIMEDOUT, dan jika data diterima, recv mengembalikan SUCCESS.
 

Memanggil getsockopt dengan opsi yang tidak didukung akan mengakibatkan kode kesalahan WSAENOPROTOOPT dikembalikan dari WSAGetLastError.

Informasi lebih rinci tentang beberapa opsi soket untuk parameter optname yang didukung oleh fungsi getsockopt tercantum di bawah ini.

SO_CONNECT_TIME
Opsi ini mengembalikan jumlah detik soket yang telah tersambung. Opsi ini hanya berlaku untuk protokol berorientasi koneksi.

Opsi SO_CONNECT_TIME dapat digunakan dengan fungsi getsockopt untuk memeriksa apakah koneksi telah dibuat. Opsi ini juga dapat digunakan saat panggilan fungsi ConnectEx sedang berlangsung. Jika koneksi dibuat, opsi SO_CONNECT_TIME dapat menentukan berapa lama koneksi telah dibuat. Jika soket tidak tersambung, getsockopt akan mengembalikan SOCKET_ERROR. Memeriksa koneksi seperti ini diperlukan untuk melihat apakah koneksi yang telah dibuat untuk sementara waktu, tanpa mengirim data apa pun. Disarankan agar aplikasi menghentikan koneksi ini.

SO_DEBUG
Catatan Penyedia layanan Windows Sockets didorong (tetapi tidak diperlukan) untuk menyediakan informasi debug output jika opsi SO_DEBUG diatur oleh aplikasi. Mekanisme untuk menghasilkan informasi debug dan formulir yang diperlukan berada di luar lingkup dokumen ini.
 
SO_ERROR
Opsi SO_ERROR mengembalikan dan mengatur ulang kode kesalahan berbasis per soket, yang berbeda dari kode kesalahan berbasis per utas yang ditangani menggunakan panggilan fungsi WSAGetLastError dan WSASetLastError . Panggilan yang berhasil menggunakan soket tidak mengatur ulang kode kesalahan berbasis soket yang dikembalikan oleh opsi SO_ERROR.
SO_EXCLUSIVEADDRUSE
Mencegah soket lain mengikat ke alamat dan port yang sama. Opsi ini harus diatur sebelum memanggil fungsi ikatan . Lihat referensi SO_EXCLUSIVEADDRUSE untuk informasi selengkapnya.
SO_GROUP_ID
Catatan Opsi ini dicadangkan. Opsi ini juga eksklusif untuk getsockopt; nilainya harus NULL.
 
SO_GROUP_PRIORITY
Opsi ini dicadangkan. Prioritas grup menunjukkan prioritas soket yang ditentukan relatif terhadap soket lain dalam grup soket. Nilai adalah bilangan bulat nonnegatif, dengan nol yang sesuai dengan prioritas tertinggi. Nilai prioritas mewakili petunjuk kepada penyedia layanan yang mendasar tentang bagaimana sumber daya yang berpotensi langka harus dialokasikan. Misalnya, setiap kali dua soket atau lebih siap untuk mengirimkan data, soket prioritas tertinggi (nilai terendah untuk SO_GROUP_PRIORITY) harus dilayankan terlebih dahulu, dengan sisanya dilayanakan sesuai dengan prioritas relatif mereka.

Kode kesalahan WSAENOPROTOOPT ditunjukkan untuk soket nongroup atau untuk penyedia layanan yang tidak mendukung soket grup.

SO_KEEPALIVE
Aplikasi dapat meminta agar penyedia layanan TCP/IP mengaktifkan penggunaan paket tetap aktif pada koneksi TCP dengan mengaktifkan opsi soket SO_KEEPALIVE. Opsi ini meminta nilai opsi tetap hidup saat ini pada soket. Penyedia Windows Sockets tidak perlu mendukung penggunaan tetap hidup: jika ya, semantik yang tepat bersifat spesifik implementasi tetapi harus sesuai dengan bagian 4.2.3.6 tentang Persyaratan untuk Host Internet—Lapisan Komunikasi yang ditentukan dalam RFC 1122 tersedia di situs web IETF. Jika koneksi terputus sebagai akibat dari tetap hidup, kode kesalahan WSAENETRESET dikembalikan ke panggilan apa pun yang sedang berlangsung di soket, dan panggilan berikutnya akan gagal dengan WSAENOTCONN. SO_KEEPALIVE tidak didukung pada soket ATM, dan permintaan untuk mengaktifkan penggunaan paket tetap hidup pada soket ATM mengalihkan kesalahan yang dikembalikan oleh soket.
SO_LINGER
SO_LINGER mengontrol tindakan yang diambil saat data yang tidak dikirim diantrekan pada soket dan closesocket dilakukan. Lihat closesocket untuk deskripsi cara pengaturan SO_LINGER memengaruhi semantik closesocket. Aplikasi mendapatkan perilaku saat ini dengan mengambil struktur LINGER (ditujukkan oleh parameter optval ).
SO_MAX_MSG_SIZE
Ini adalah opsi soket get-only yang menunjukkan ukuran keluar maksimum (kirim) pesan untuk jenis soket berorientasi pesan (misalnya, SOCK_DGRAM) seperti yang diterapkan oleh penyedia layanan tertentu. Ini tidak memiliki arti untuk soket berorientasi aliran byte. Tidak ada ketentuan untuk mengetahui ukuran pesan masuk maksimum.
SO_PROTOCOL_INFO
Ini adalah opsi get-only yang memasok struktur WSAPROTOCOL_INFO yang terkait dengan soket ini. Lihat WSAEnumProtocols untuk informasi selengkapnya tentang struktur ini.
SO_SNDBUF
Ketika implementasi Windows Sockets mendukung opsi SO_RCVBUF dan SO_SNDBUF, aplikasi dapat meminta ukuran buffer yang berbeda (lebih besar atau lebih kecil). Panggilan ke setsockopt dapat berhasil bahkan jika implementasi tidak memberikan seluruh jumlah yang diminta. Aplikasi harus memanggil fungsi ini dengan opsi yang sama untuk memeriksa ukuran buffer yang benar-benar disediakan.
SO_REUSEADDR
Secara default, soket tidak dapat diikat (lihat ikatan) ke alamat lokal yang sudah digunakan. Namun, terkadang, perlu untuk menggunakan kembali alamat dengan cara ini. Karena setiap koneksi diidentifikasi secara unik oleh kombinasi alamat lokal dan jarak jauh, tidak ada masalah dengan memiliki dua soket yang terikat ke alamat lokal yang sama selama alamat jarak jauh berbeda. Untuk memberi tahu penyedia Soket Windows bahwa ikatan pada soket tidak boleh dilarang karena alamat yang diinginkan sudah digunakan oleh soket lain, aplikasi harus mengatur opsi soket SO_REUSEADDR untuk soket sebelum mengeluarkan ikatan. Perhatikan bahwa opsi hanya ditafsirkan pada saat pengikatan: oleh karena itu tidak perlu (tetapi tidak berbahaya) untuk mengatur opsi pada soket yang tidak terikat ke alamat yang ada, dan mengatur atau mengatur ulang opsi setelah ikatan tidak berpengaruh pada soket ini atau soket lainnya. SO_REUSEADDR tidak berlaku untuk soket ATM, dan meskipun permintaan untuk menggunakan kembali dan alamat tidak mengakibatkan kesalahan, mereka tidak berpengaruh ketika soket ATM sedang digunakan.
PVD_CONFIG
Opsi ini mengambil objek struktur data buram dari penyedia layanan yang terkait dengan soket. Objek ini menyimpan informasi konfigurasi penyedia layanan saat ini. Format yang tepat dari struktur data ini khusus untuk penyedia layanan.
TCP_NODELAY
Opsi TCP_NODELAY khusus untuk penyedia layanan TCP/IP. Algoritma Nagle dinonaktifkan jika opsi TCP_NODELAY diaktifkan (dan sebaliknya). Algoritma Nagle (dijelaskan dalam RFC 896) sangat efektif dalam mengurangi jumlah paket kecil yang dikirim oleh host. Proses ini melibatkan buffering mengirim data ketika ada data yang tidak diakui yang sudah ada dalam penerbangan atau buffering mengirim data hingga paket ukuran penuh dapat dikirim. Sangat disarankan bahwa implementasi Windows Sockets memungkinkan Algoritma Nagle secara default karena, untuk sebagian besar protokol aplikasi, Nagle Algoritma dapat memberikan peningkatan performa yang signifikan. Namun, untuk beberapa aplikasi algoritma ini dapat menghambat performa, dan setsockopt dengan opsi yang sama dapat digunakan untuk menonaktifkannya. Ini adalah aplikasi di mana banyak pesan kecil dikirim, dan penundaan waktu antara pesan dipertahankan.
Catatan Saat mengeluarkan panggilan Winsock pemblokiran seperti getsockopt, Winsock mungkin perlu menunggu peristiwa jaringan sebelum panggilan dapat selesai. Winsock melakukan penantian yang dapat diperingatkan dalam situasi ini, yang dapat terganggu oleh panggilan prosedur asinkron (APC) yang dijadwalkan pada utas yang sama. Mengeluarkan panggilan Winsock pemblokiran lain di dalam APC yang mengganggu panggilan Winsock pemblokiran yang sedang berlangsung pada utas yang sama akan menyebabkan perilaku yang tidak terdefinisi, dan tidak boleh dicoba oleh klien Winsock.
 

Contoh Kode

Sampel kode berikut menunjukkan penggunaan fungsi getsockopt .
#include <stdio.h>
#include "winsock2.h"
#include <windows.h>

void main() {

  //---------------------------------------
  // Declare variables
  WSADATA wsaData;
  SOCKET ListenSocket;
  sockaddr_in service;

  //---------------------------------------
  // Initialize Winsock
  int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
  if( iResult != NO_ERROR )
    printf("Error at WSAStartup\n");

  //---------------------------------------
  // Create a listening socket
  ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
  if (ListenSocket == INVALID_SOCKET) {
    printf("Error at socket()\n");
    WSACleanup();
    return;
  }

  //---------------------------------------
  // Bind the socket to the local IP address
  // and port 27015
  hostent* thisHost;
  char* ip;
  u_short port;
  port = 27015;
  thisHost = gethostbyname("");
  ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list);

  service.sin_family = AF_INET;
  service.sin_addr.s_addr = inet_addr(ip);
  service.sin_port = htons(port);
 
  if ( bind( ListenSocket,(SOCKADDR*) &service, sizeof(service) )  == SOCKET_ERROR ) {
    printf("bind failed\n");
    closesocket(ListenSocket);
    return;
  }

  //---------------------------------------
  // Initialize variables and call getsockopt. 
  // The SO_ACCEPTCONN parameter is a socket option 
  // that tells the function to check whether the 
  // socket has been put in listening mode or not. 
  // The various socket options return different
  // information about the socket. This call should
  // return 0 to the optVal parameter, since the socket
  // is not in listening mode.
  int optVal;
  int optLen = sizeof(int);

  if (getsockopt(ListenSocket, 
    SOL_SOCKET, 
    SO_ACCEPTCONN, 
    (char*)&optVal, 
    &optLen) != SOCKET_ERROR)
    printf("SockOpt Value: %ld\n", optVal);

  //---------------------------------------
  // Put the listening socket in listening mode.
  if (listen( ListenSocket, 100 ) == SOCKET_ERROR) {
    printf("error listening\n");
  } 

  //---------------------------------------
  // Call getsockopt again to verify that 
  // the socket is in listening mode.
  if (getsockopt(ListenSocket, 
    SOL_SOCKET, 
    SO_ACCEPTCONN, 
    (char*)&optVal, 
    &optLen) != SOCKET_ERROR)
    printf("SockOpt Value: %ld\n", optVal);

  WSACleanup();
  return;
}

Catatan untuk Soket IrDA

  • File header Af_irda.h harus disertakan secara eksplisit.
  • Windows mengembalikan WSAENETDOWN untuk menunjukkan driver transceiver yang mendasar gagal diinisialisasi dengan tumpukan protokol IrDA.
  • IrDA mendukung beberapa opsi soket khusus:
    Nilai Jenis Makna
    IRLMP_ENUMDEVICES *DEVICELIST Menjelaskan perangkat dalam rentang.
    IRLMP_IAS_QUERY *IAS_QUERY Ambil atribut IAS.
     

Sebelum koneksi soket IrDA dapat dimulai, alamat perangkat harus diperoleh dengan melakukan panggilan fungsi getsockopt(,,IRLMP_ENUMDEVICES,,), yang mengembalikan daftar semua perangkat IrDA yang tersedia. Alamat perangkat yang dikembalikan dari panggilan fungsi disalin ke dalam struktur SOCKADDR_IRDA , yang pada gilirannya digunakan oleh panggilan berikutnya ke panggilan fungsi sambungkan .

Penemuan dapat dilakukan dengan dua cara:

  1. Pertama, melakukan panggilan fungsi getsockopt dengan opsi IRLMP_ENUMDEVICES menyebabkan satu penemuan dijalankan pada setiap adaptor diam. Daftar perangkat yang ditemukan dan perangkat yang di-cache (pada adaptor aktif) segera dikembalikan.

    Kode berikut menunjukkan pendekatan ini.

    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <af_irda.h>
    #include <stdio.h>
    #include <windows.h>
    
    // link with Ws2_32.lib
    
    int __cdecl main()
    {
    
        //-----------------------------------------
        // Declare and initialize variables
        WSADATA wsaData;
    
        int iResult;
        int i;
        DWORD dwError;
    
        SOCKET Sock = INVALID_SOCKET;
    
    #define DEVICE_LIST_LEN    10
    
    
        SOCKADDR_IRDA DestSockAddr = { AF_IRDA, 0, 0, 0, 0, "SampleIrDAService" };
    
        unsigned char DevListBuff[sizeof (DEVICELIST) -
                                  sizeof (IRDA_DEVICE_INFO) +
                                  (sizeof (IRDA_DEVICE_INFO) * DEVICE_LIST_LEN)];
    
        int DevListLen = sizeof (DevListBuff);
        PDEVICELIST pDevList;
    
        pDevList = (PDEVICELIST) & DevListBuff;
    
        // Initialize Winsock
        iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
        if (iResult != 0) {
            printf("WSAStartup failed: %d\n", iResult);
            return 1;
        }
    
        Sock = socket(AF_IRDA, SOCK_STREAM, 0);
        if (Sock == INVALID_SOCKET) {
            dwError = WSAGetLastError();
            printf
                ("socket failed trying to create an AF_IRDA socket with error %d\n",
                 dwError);
    
            if (dwError == WSAEAFNOSUPPORT) {
                printf("Check that the local computer has an infrared device\n");
                printf
                    ("and a device driver is installed for the infrared device\n");
            }
            WSACleanup();
            return 1;
        }
        // Sock is not in connected state
        iResult = getsockopt(Sock, SOL_IRLMP, IRLMP_ENUMDEVICES,
                             (char *) pDevList, &DevListLen);
        if (iResult == SOCKET_ERROR) {
            printf("getsockopt failed with error %d\n", WSAGetLastError());
            WSACleanup();
            return 1;
        }
    
        if (pDevList->numDevice == 0) {
            // no devices discovered or cached
            // not a bad idea to run a couple of times
            printf("No IRDA devices were discovered or cached\n");
        } else {
            // one per discovered device
            for (i = 0; i < (int) pDevList->numDevice; i++) {
                // typedef struct _IRDA_DEVICE_INFO
                // {
                //     u_char    irdaDeviceID[4];
                //     char      irdaDeviceName[22];
                //     u_char    irdaDeviceHints1;
                //     u_char    irdaDeviceHints2;
                //     u_char    irdaCharSet;
                // } _IRDA_DEVICE_INFO;
    
                // pDevList->Device[i]. see _IRDA_DEVICE_INFO for fields
                // display the device names and let the user select one
            }
        }
    
        // assume the user selected the first device [0]
        memcpy(&DestSockAddr.irdaDeviceID[0], &pDevList->Device[0].irdaDeviceID[0],
               4);
    
        iResult = connect(Sock, (const struct sockaddr *) &DestSockAddr,
                          sizeof (SOCKADDR_IRDA));
        if (iResult == SOCKET_ERROR) {
            printf("connect failed with error %d\n", WSAGetLastError());
        } else
            printf("connect to first IRDA device was successful\n");
    
        WSACleanup();
        return 0;
    }
    
    
  2. Pendekatan kedua untuk melakukan penemuan alamat perangkat IrDA adalah melakukan penemuan malas; dalam pendekatan ini, aplikasi tidak diberi tahu sampai daftar perangkat yang ditemukan berubah dari penemuan terakhir yang dijalankan oleh tumpukan.
Struktur DEVICELIST yang diperlihatkan dalam kolom Jenis dalam tabel sebelumnya adalah array deskripsi perangkat yang dapat diperluas. IrDA mengisi deskripsi perangkat sebanyak yang dapat dimuat dalam buffer yang ditentukan. Deskripsi perangkat terdiri dari pengidentifikasi perangkat yang diperlukan untuk membentuk struktur sockaddr_irda, dan string yang dapat ditampilkan yang menjelaskan perangkat.

Struktur IAS_QUERY yang diperlihatkan dalam kolom Jenis dalam tabel sebelumnya digunakan untuk mengambil satu atribut dari satu kelas dari database IAS perangkat serekan. Aplikasi menentukan perangkat dan kelas untuk dikueri serta atribut dan jenis atribut. Perhatikan bahwa perangkat akan diperoleh sebelumnya dengan panggilan ke getsockopt(IRLMP_ENUMDEVICES). Diharapkan bahwa aplikasi mengalokasikan buffer, dengan ukuran yang diperlukan, untuk parameter yang dikembalikan.

Banyak opsi soket tingkat tidak bermakna bagi IrDA; hanya SO_LINGER dan SO_DONTLINGER yang didukung secara khusus.

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 winsock.h (termasuk Winsock2.h)
Pustaka Ws2_32.lib
DLL Ws2_32.dll

Lihat juga

Opsi Soket IPPROTO_IP

Opsi Soket IPPROTO_IPV6

Opsi Soket IPPROTO_RM

Opsi Soket IPPROTO_TCP

Opsi Soket IPPROTO_UDP

Opsi Soket NSPROTO_IPX

Opsi Soket SOL_APPLETALK

Opsi Soket SOL_IRLMP

Opsi Soket SOL_SOCKET

Opsi Soket

WSAAsyncSelect

WSAConnect

WSAGetLastError

WSAIoctl

WSASetLastError

Fungsi Winsock

ioctlsocket

recv

setsockopt

soket