fungsi setsockopt (winsock2.h)
Fungsi setsockopt menetapkan opsi soket.
Sintaks
int WSAAPI setsockopt(
[in] SOCKET s,
[in] int level,
[in] int optname,
[in] const char *optval,
[in] int optlen
);
Parameter
[in] s
Deskriptor yang mengidentifikasi soket.
[in] level
Tingkat di mana opsi ditentukan (misalnya, SOL_SOCKET).
[in] optname
Opsi soket yang nilainya akan ditetapkan (misalnya, SO_BROADCAST). Parameter optname harus merupakan opsi soket yang ditentukan dalam tingkat yang ditentukan, atau perilaku tidak terdefinisi.
[in] optval
Penunjuk ke buffer tempat nilai untuk opsi yang diminta ditentukan.
[in] optlen
Ukuran, dalam byte, dari buffer yang diacu oleh parameter optval .
Menampilkan nilai
Jika tidak ada kesalahan yang terjadi, setsockopt mengembalikan nol. Jika tidak, nilai SOCKET_ERROR 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. | |
Buffer yang diacu oleh parameter optval tidak berada di bagian ruang alamat proses yang valid atau parameter optlen terlalu kecil. | |
Panggilan Windows Sockets 1.1 yang diblokir sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik. | |
Parameter tingkat tidak valid, atau informasi dalam buffer yang diacu oleh parameter optval tidak valid. | |
Koneksi telah kehabisan waktu ketika SO_KEEPALIVE diatur. | |
Opsi tidak diketahui atau tidak didukung untuk penyedia atau soket yang ditentukan (lihat batasan SO_GROUP_PRIORITY). | |
Koneksi telah direset ketika SO_KEEPALIVE diatur. | |
Deskriptor bukan soket. |
Keterangan
Fungsi setsockopt menetapkan nilai saat ini untuk opsi soket yang terkait dengan soket jenis apa pun, dalam status apa pun. Meskipun opsi dapat ada di beberapa tingkat protokol, opsi selalu ada di tingkat soket paling atas. Opsi memengaruhi operasi soket, seperti apakah data yang dipercepat (data OOB misalnya) diterima di aliran data normal, dan apakah pesan siaran dapat dikirim pada soket.
sizeof(int)
untuk opsi Boolean. Untuk opsi lain, optval menunjuk ke bilangan bulat atau struktur yang berisi nilai yang diinginkan untuk opsi, dan optlen adalah panjang bilangan bulat atau struktur.
Tabel berikut mencantumkan beberapa opsi umum yang didukung oleh fungsi setsockopt . Kolom Jenis mengidentifikasi jenis data yang ditangani oleh parameter optval . Kolom Deskripsi menyediakan beberapa informasi dasar tentang opsi soket. Untuk daftar opsi soket yang lebih lengkap dan informasi yang lebih rinci (nilai default, misalnya), lihat topik terperinci di bawah Opsi Soket.
Tingkat = SOL_SOCKET
Nilai | Jenis | Deskripsi |
---|---|---|
SO_BROADCAST | BOOL | Mengonfigurasi soket untuk mengirim data siaran. |
SO_CONDITIONAL_ACCEPT | BOOL | Mengaktifkan koneksi masuk akan diterima atau ditolak oleh aplikasi, bukan oleh tumpukan protokol. |
SO_DEBUG | BOOL | Mengaktifkan output debug. Penyedia Microsoft saat ini tidak mengeluarkan informasi debug apa pun. |
SO_DONTLINGER | BOOL | Tidak memblokir penutupan menunggu data yang tidak terkirim dikirim. Mengatur opsi ini setara dengan pengaturan SO_LINGER dengan l_onoff diatur ke nol. |
SO_DONTROUTE | BOOL | Mengatur apakah data keluar harus dikirim pada antarmuka tempat soket terikat dan bukan dirutekan pada beberapa antarmuka lain. Opsi ini tidak didukung pada soket ATM (menghasilkan kesalahan). |
SO_GROUP_PRIORITY | int | Dicadangkan. |
SO_KEEPALIVE | BOOL | Memungkinkan pengiriman paket tetap hidup untuk koneksi soket. Tidak didukung pada soket ATM (menghasilkan kesalahan). |
SO_LINGER | BERLAMA | Linger pada penutupan jika ada data yang tidak terkirman. |
SO_OOBINLINE | BOOL | Menunjukkan bahwa data di luar batas harus dikembalikan sejalan dengan data reguler. Opsi ini hanya valid untuk protokol berorientasi koneksi yang mendukung data di luar band. Untuk diskusi tentang topik ini, lihat Protokol Data Out-Of-band Independen. |
SO_RCVBUF | int | Menentukan total ruang buffer per soket yang disediakan untuk penerimaan. |
SO_REUSEADDR | BOOL | Memungkinkan soket terikat ke alamat yang sudah digunakan. Untuk informasi selengkapnya, lihat mengikat. Tidak berlaku pada soket ATM. |
SO_EXCLUSIVEADDRUSE | BOOL | Memungkinkan soket terikat untuk akses eksklusif. Tidak memerlukan hak administratif. |
SO_RCVTIMEO | DWORD | Mengatur batas waktu, dalam milidetik, untuk memblokir panggilan terima. |
SO_SNDBUF | int | Menentukan total ruang buffer per soket yang disediakan untuk pengiriman. |
SO_SNDTIMEO | DWORD | Waktu habis, dalam milidetik, untuk memblokir pengiriman panggilan. |
SO_UPDATE_ACCEPT_CONTEXT | int | Updates soket yang diterima dengan konteks soket mendengarkan. |
PVD_CONFIG | Dependen Penyedia Layanan | Objek ini menyimpan informasi konfigurasi untuk penyedia layanan yang terkait dengan soket. Format yang tepat dari struktur data ini khusus untuk penyedia layanan. |
Untuk informasi selengkapnya dan terperinci tentang opsi soket untuk SOL_SOCKET tingkat = , lihat Opsi Soket SOL_SOCKET.
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.
Tingkat = NSPROTO_IPX
Nilai | Jenis | Deskripsi |
---|---|---|
IPX_PTYPE | int | Mengatur jenis paket IPX. |
IPX_FILTERPTYPE | int | Mengatur jenis paket filter terima |
IPX_STOPFILTERPTYPE | int | Menghentikan pemfilteran set jenis filter dengan IPX_FILTERTYPE |
IPX_DSTYPE | int | Mengatur nilai bidang aliran data di header SPX pada setiap paket yang dikirim. |
IPX_EXTENDED_ADDRESS | BOOL | Mengatur apakah alamat yang diperluas diaktifkan. |
IPX_RECVHDR | BOOL | Mengatur apakah header protokol dikirim pada semua header penerima. |
IPX_RECEIVE_BROADCAST | BOOL | Menunjukkan paket siaran kemungkinan ada di soket. Atur ke TRUE secara default. Aplikasi yang tidak menggunakan siaran harus mengatur ini ke FALSE untuk performa sistem yang lebih baik. |
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. |
Untuk informasi selengkapnya dan terperinci tentang opsi soket untuk NSPROTO_IPX tingkat = , lihat Opsi Soket NSPROTO_IPX.
Opsi BSD yang tidak didukung untuk setsockopt diperlihatkan dalam tabel berikut.
Nilai | Jenis | Deskripsi |
---|---|---|
SO_ACCEPTCONN | BOOL | Mengembalikan apakah soket berada dalam mode mendengarkan. Opsi ini hanya Valid untuk protokol berorientasi koneksi. Opsi soket ini tidak didukung untuk pengaturan. |
SO_RCVLOWAT | int | Opsi soket dari BSD UNIX disertakan untuk kompatibilitas mundur. Opsi ini mengatur jumlah minimum byte yang akan diproses untuk operasi input soket. |
SO_SNDLOWAT | int | Opsi soket dari BSD UNIX disertakan untuk kompatibilitas mundur. Opsi ini mengatur jumlah minimum byte yang akan diproses untuk operasi output soket. |
SO_TYPE | int | Mengembalikan jenis soket untuk soket yang diberikan (SOCK_STREAM atau SOCK_DGRAM, misalnya Opsi soket ini tidak didukung untuk pengaturan jenis soket. |
Contoh Kode
Contoh berikut menunjukkan fungsi setsockopt .#ifndef UNICODE
#define UNICODE
#endif
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
int main()
{
//---------------------------------------
// Declare variables
WSADATA wsaData;
SOCKET ListenSocket;
sockaddr_in service;
int iResult = 0;
BOOL bOptVal = FALSE;
int bOptLen = sizeof (BOOL);
int iOptVal = 0;
int iOptLen = sizeof (int);
//---------------------------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"Error at WSAStartup()\n");
return 1;
}
//---------------------------------------
// Create a listening socket
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
WSACleanup();
return 1;
}
//---------------------------------------
// 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);
iResult = bind(ListenSocket, (SOCKADDR *) & service, sizeof (service));
if (iResult == SOCKET_ERROR) {
wprintf(L"bind failed with error %u\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
//---------------------------------------
// Initialize variables and call setsockopt.
// The SO_KEEPALIVE parameter is a socket option
// that makes the socket send keepalive messages
// on the session. The SO_KEEPALIVE socket option
// requires a boolean value to be passed to the
// setsockopt function. If TRUE, the socket is
// configured to send keepalive messages, if FALSE
// the socket configured to NOT send keepalive messages.
// This section of code tests the setsockopt function
// by checking the status of SO_KEEPALIVE on the socket
// using the getsockopt function.
bOptVal = TRUE;
iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &iOptVal, &iOptLen);
if (iResult == SOCKET_ERROR) {
wprintf(L"getsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
} else
wprintf(L"SO_KEEPALIVE Value: %ld\n", iOptVal);
iResult = setsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &bOptVal, bOptLen);
if (iResult == SOCKET_ERROR) {
wprintf(L"setsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
} else
wprintf(L"Set SO_KEEPALIVE: ON\n");
iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &iOptVal, &iOptLen);
if (iResult == SOCKET_ERROR) {
wprintf(L"getsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
} else
wprintf(L"SO_KEEPALIVE Value: %ld\n", iOptVal);
closesocket(ListenSocket);
WSACleanup();
return 0;
}
Catatan untuk Soket IrDA
Saat mengembangkan aplikasi menggunakan soket Windows untuk IrDA, perhatikan hal berikut:
- File header Af_irda.h harus disertakan secara eksplisit.
- IrDA menyediakan opsi soket berikut:
Nilai Jenis Makna IRLMP_IAS_SET *IAS_SET Mengatur atribut IAS
Opsi soket IRLMP_IAS_SET memungkinkan aplikasi untuk mengatur satu atribut dari satu kelas di IAS lokal. Aplikasi menentukan kelas yang akan diatur, atribut, dan jenis atribut. Aplikasi ini diharapkan mengalokasikan buffer dengan ukuran yang diperlukan untuk parameter yang dilewatkan.
IrDA menyediakan database IAS yang menyimpan informasi berbasis IrDA. Akses terbatas ke database IAS tersedia melalui antarmuka Windows Sockets 2, tetapi akses tersebut biasanya tidak digunakan oleh aplikasi, dan terutama ada untuk mendukung koneksi ke perangkat non-Windows yang tidak sesuai dengan konvensi IrDA Windows Sockets 2.
Struktur berikut, IAS_SET, digunakan dengan opsi setsockopt IRLMP_IAS_SET untuk mengelola database IAS lokal:
// #include <Af_irda.h> for this struct
typedef struct _IAS_SET {
u_char irdaClassName[IAS_MAX_CLASSNAME];
char irdaAttribName[IAS_MAX_ATTRIBNAME];
u_long irdaAttribType;
union
{
LONG irdaAttribInt;
struct
{
u_long Len;
u_char OctetSeq[IAS_MAX_OCTET_STRING];
} irdaAttribOctetSeq;
struct
{
u_long Len;
u_long CharSet;
u_char UsrStr[IAS_MAX_USER_STRING];
} irdaAttribUsrStr;
} irdaAttribute;
} IAS_SET, *PIAS_SET, FAR *LPIASSET;
Struktur berikut, IAS_QUERY, digunakan dengan opsi setsockopt IRLMP_IAS_QUERY untuk mengkueri database IAS serekan:
// #include <Af_irda.h> for this struct
typedef struct _WINDOWS_IAS_QUERY {
u_char irdaDeviceID[4];
char irdaClassName[IAS_MAX_CLASSNAME];
char irdaAttribName[IAS_MAX_ATTRIBNAME];
u_long irdaAttribType;
union
{
LONG irdaAttribInt;
struct
{
u_long Len;
u_char OctetSeq[IAS_MAX_OCTET_STRING];
} irdaAttribOctetSeq;
struct
{
u_long Len;
u_long CharSet;
u_char UsrStr[IAS_MAX_USER_STRING];
} irdaAttribUsrStr;
} irdaAttribute;
} IAS_QUERY, *PIAS_QUERY, FAR *LPIASQUERY;
Banyak opsi soket tingkat SO_ tidak bermakna bagi IrDA. Hanya SO_LINGER 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
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 (termasuk Winsock2.h) |
Pustaka | Ws2_32.lib |
DLL | Ws2_32.dll |