setockopt-Funktion (winsock.h)
Die setockopt-Funktion legt eine Socketoption fest.
Syntax
int setsockopt(
[in] SOCKET s,
[in] int level,
[in] int optname,
[in] const char *optval,
[in] int optlen
);
Parameter
[in] s
Ein Deskriptor, der einen Socket identifiziert.
[in] level
Die Ebene, auf der die Option definiert ist (z. B. SOL_SOCKET).
[in] optname
Die Socketoption, für die der Wert festgelegt werden soll (z. B. SO_BROADCAST). Der optname-Parameter muss eine Socketoption sein, die innerhalb der angegebenen Ebene definiert ist, oder das Verhalten ist nicht definiert.
[in] optval
Ein Zeiger auf den Puffer, in dem der Wert für die angeforderte Option angegeben wird.
[in] optlen
Die Größe des Puffers in Bytes, auf den der optval-Parameter verweist.
Rückgabewert
Wenn kein Fehler auftritt, gibt setsockopt null zurück. Andernfalls wird der Wert SOCKET_ERROR zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.
Fehlercode | Bedeutung |
---|---|
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen. | |
Beim Netzwerksubsystem ist ein Fehler aufgetreten. | |
Der Puffer, auf den der optval-Parameter verweist, befindet sich nicht in einem gültigen Teil des Prozessadressraums, oder der optlen-Parameter ist zu klein. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion. | |
Der Levelparameter ist ungültig, oder die Informationen im Puffer, auf die der optval-Parameter verweist, sind ungültig. | |
Die Verbindung hat ein Timeout, wenn SO_KEEPALIVE festgelegt ist. | |
Die Option ist für den angegebenen Anbieter oder Socket unbekannt oder wird nicht unterstützt (siehe SO_GROUP_PRIORITY Einschränkungen). | |
Die Verbindung wurde zurückgesetzt, wenn SO_KEEPALIVE festgelegt wurde. | |
Der Deskriptor ist kein Socket. |
Hinweise
Die setockopt-Funktion legt den aktuellen Wert für eine Socketoption fest, die einem Socket eines beliebigen Typs in einem beliebigen Zustand zugeordnet ist. Obwohl Optionen auf mehreren Protokollebenen vorhanden sein können, sind sie immer auf der obersten Socketebene vorhanden. Optionen wirken sich auf Socketvorgänge aus, z. B. ob beschleunigte Daten (z. B. OOB-Daten) im normalen Datenstrom empfangen werden und ob Broadcastnachrichten auf dem Socket gesendet werden können.
sizeof(int)
sein. Bei anderen Optionen zeigt optval auf eine ganze Zahl oder Struktur, die den gewünschten Wert für die Option enthält, und optlen ist die Länge der ganzzahligen Oder Struktur.
In den folgenden Tabellen sind einige der allgemeinen Optionen aufgeführt, die von der setockopt-Funktion unterstützt werden. Die Spalte Type gibt den Typ der daten an, die durch den optval-Parameter adressiert werden. Die Spalte Beschreibung enthält einige grundlegende Informationen zur Socketoption. Ausführlichere Listen der Socketoptionen und ausführlichere Informationen (z. B. Standardwerte) finden Sie in den ausführlichen Themen unter Socketoptionen.
Ebene = SOL_SOCKET
Wert | type | BESCHREIBUNG |
---|---|---|
SO_BROADCAST | BOOL | Konfiguriert einen Socket für das Senden von Broadcastdaten. |
SO_CONDITIONAL_ACCEPT | BOOL | Ermöglicht, dass eingehende Verbindungen von der Anwendung und nicht vom Protokollstapel akzeptiert oder abgelehnt werden. |
SO_DEBUG | BOOL | Aktiviert die Debugausgabe. Microsoft-Anbieter geben derzeit keine Debuginformationen aus. |
SO_DONTLINGER | BOOL | Das Warten auf nicht gesendete Daten wird nicht blockiert. Das Festlegen dieser Option entspricht dem Festlegen SO_LINGER mit l_onoff auf Null festgelegt. |
SO_DONTROUTE | BOOL | Legt fest, ob ausgehende Daten an die Schnittstelle gesendet werden sollen, an die der Socket gebunden ist, und nicht an eine andere Schnittstelle weitergeleitet werden sollen. Diese Option wird für ATM-Sockets nicht unterstützt (führt zu einem Fehler). |
SO_GROUP_PRIORITY | INT | Reserviert. |
SO_KEEPALIVE | BOOL | Ermöglicht das Senden von Keep-Alive-Paketen für eine Socketverbindung. Wird für ATM-Sockets nicht unterstützt (führt zu einem Fehler). |
SO_LINGER | VERWEILEN | Bleibt geschlossen, wenn nicht gesendete Daten vorhanden sind. |
SO_OOBINLINE | BOOL | Gibt an, dass out-of-bound-Daten inline mit regulären Daten zurückgegeben werden sollen. Diese Option gilt nur für verbindungsorientierte Protokolle, die Out-of-Band-Daten unterstützen. Eine Diskussion zu diesem Thema finden Sie unter Protokollunabhängige Out-Of-Band-Daten. |
SO_RCVBUF | INT | Gibt den Gesamtpufferspeicher pro Socket an, der für Empfangsvorgänge reserviert ist. |
SO_REUSEADDR | BOOL | Ermöglicht, dass der Socket an eine bereits verwendete Adresse gebunden wird. Weitere Informationen finden Sie unter binden. Gilt nicht für Atm-Sockets. |
SO_EXCLUSIVEADDRUSE | BOOL | Ermöglicht das Binden eines Sockets für den exklusiven Zugriff. Erfordert keine Administratorrechte. |
SO_RCVTIMEO | DWORD | Legt das Timeout in Millisekunden für das Blockieren von Empfangsanrufen fest. |
SO_SNDBUF | INT | Gibt den Gesamtpufferspeicher pro Socket an, der für Sendevorgänge reserviert ist. |
SO_SNDTIMEO | DWORD | Das Timeout in Millisekunden für das Blockieren von Sendeanrufen. |
SO_UPDATE_ACCEPT_CONTEXT | INT | Updates den akzeptierenden Socket mit dem Kontext des abhörenden Sockets. |
PVD_CONFIG | Dienstanbieterabhängig | Dieses Objekt speichert die Konfigurationsinformationen für den Dienstanbieter, der Sockets zugeordnet ist. Das genaue Format dieser Datenstruktur ist dienstanbieterspezifisch. |
Ebene = IPPROTO_TCP
Weitere Informationen finden Sie unter TCP_NODELAY in IPPROTO_TCP Socketoptionen. Ausführlichere und ausführlichere Informationen zu Socketoptionen für IPPROTO_TCP = finden Sie auch indiesem Thema.
Ebene = NSPROTO_IPX
Wert | type | BESCHREIBUNG |
---|---|---|
IPX_PTYPE | INT | Legt den IPX-Pakettyp fest. |
IPX_FILTERPTYPE | INT | Legt den Pakettyp des Empfangsfilters fest |
IPX_STOPFILTERPTYPE | INT | Beendet das Filtern des Filtertypsatzes mit IPX_FILTERTYPE |
IPX_DSTYPE | INT | Legt den Wert des Datenstromfelds im SPX-Header für jedes gesendete Paket fest. |
IPX_EXTENDED_ADDRESS | BOOL | Legt fest, ob die erweiterte Adressierung aktiviert ist. |
IPX_RECVHDR | BOOL | Legt fest, ob der Protokollheader für alle Empfangsheader gesendet wird. |
IPX_RECEIVE_BROADCAST | BOOL | Gibt an, dass Broadcastpakete wahrscheinlich im Socket vorhanden sind. Legen Sie standardmäßig auf TRUE fest. Anwendungen, die keine Broadcasts verwenden, sollten dies auf FALSE festlegen, um die Systemleistung zu verbessern. |
IPX_IMMEDIATESPXACK | BOOL | Weist SPX-Verbindungen an, vor dem Senden eines ACK nicht zu verzögern. Anwendungen ohne Hin- und Her-Datenverkehr sollten dies auf TRUE festlegen, um die Leistung zu erhöhen. |
Ausführlichere und ausführlichere Informationen zu Socketoptionen für NSPROTO_IPX finden = Sie unter NSPROTO_IPX Socketoptionen.
BSD-Optionen, die für setsockopt nicht unterstützt werden, sind in der folgenden Tabelle aufgeführt.
Wert | type | BESCHREIBUNG |
---|---|---|
SO_ACCEPTCONN | BOOL | Gibt zurück, ob sich ein Socket im Abhörmodus befindet. Diese Option ist nur für verbindungsorientierte Protokolle gültig. Diese Socketoption wird für die Einstellung nicht unterstützt. |
SO_RCVLOWAT | INT | Aus Gründen der Abwärtskompatibilität ist eine Socketoption von BSD UNIX enthalten. Mit dieser Option wird die Mindestanzahl von Bytes festgelegt, die für Socketeingabevorgänge verarbeitet werden sollen. |
SO_SNDLOWAT | INT | Aus Gründen der Abwärtskompatibilität ist eine Socketoption von BSD UNIX enthalten. Mit dieser Option wird die Mindestanzahl von Bytes festgelegt, die für Socketausgabevorgänge verarbeitet werden sollen. |
SO_TYPE | INT | Gibt den Sockettyp für den angegebenen Socket zurück (SOCK_STREAM oder SOCK_DGRAM, z. B. Diese Socketoption wird für die Einstellung des Sockettyps nicht unterstützt. |
Beispielcode
Das folgende Beispiel veranschaulicht die setockopt-Funktion .#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;
}
Hinweise zu IrDA-Sockets
Beachten Sie beim Entwickeln von Anwendungen, die Windows-Sockets für IrDA verwenden, Folgendes:
- Die Af_irda.h-Headerdatei muss explizit enthalten sein.
- IrDA bietet die folgende Socketoption:
Wert type Bedeutung IRLMP_IAS_SET *IAS_SET Legt IAS-Attribute fest
Mit der IRLMP_IAS_SET Socketoption kann die Anwendung ein einzelnes Attribut einer einzelnen Klasse im lokalen IAS festlegen. Die Anwendung gibt die festzulegende Klasse, das Attribut und den Attributtyp an. Es wird erwartet, dass die Anwendung einen Puffer der erforderlichen Größe für die übergebenen Parameter ordnet.
IrDA stellt eine IAS-Datenbank bereit, in der IrDA-basierte Informationen gespeichert werden. Der eingeschränkte Zugriff auf die IAS-Datenbank ist über die Windows Sockets 2-Schnittstelle verfügbar, dieser Zugriff wird jedoch normalerweise nicht von Anwendungen verwendet und dient in erster Linie zur Unterstützung von Verbindungen mit Nicht-Windows-Geräten, die nicht mit den IrDA-Konventionen von Windows Sockets 2 kompatibel sind.
Die folgende Struktur , IAS_SET, wird mit der option IRLMP_IAS_SET setsockopt verwendet, um die lokale IAS-Datenbank zu verwalten:
// #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;
Die folgende Struktur IAS_QUERY wird mit der option IRLMP_IAS_QUERY setsockopt verwendet, um die IAS-Datenbank eines Peers abzufragen:
// #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;
Viele socket-Optionen auf SO_-Ebene sind für IrDA nicht sinnvoll. Nur SO_LINGER wird speziell unterstützt.
Windows Phone 8: Diese Funktion wird für Windows Phone Store-Apps auf Windows Phone 8 und höher unterstützt.
Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Anforderungen
Unterstützte Mindestversion (Client) | Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | winsock.h (Winsock2.h einschließen) |
Bibliothek | Ws2_32.lib |
DLL | Ws2_32.dll |