Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Setsockopt-Funktion legt eine Socketoption fest.
Syntax
int setsockopt(
[in] SOCKET s,
[in] int level,
[in] int optname,
[in] const char *optval,
[in] int optlen
);
Die 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 ein Wert von 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. | |
| Fehler des Netzwerksubsystems. | |
| 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 durch den Optval-Parameter verwiesen wird, sind ungültig. | |
| Die Verbindung ist beim Festlegen SO_KEEPALIVE timeout. | |
| Die Option ist für den angegebenen Anbieter oder Socket unbekannt oder nicht unterstützt (siehe SO_GROUP_PRIORITY Einschränkungen). | |
| Die Verbindung wurde zurückgesetzt, wenn SO_KEEPALIVE festgelegt ist. | |
| Der Deskriptor ist kein Socket. |
Bemerkungen
Die Setsockopt-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 Übertragungsnachrichten im 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 ganzen Zahl oder Struktur.
In den folgenden Tabellen sind einige der allgemeinen Optionen aufgeführt, die von der Setockopt-Funktion unterstützt werden. In der Spalte "Typ" wird der Datentyp identifiziert, der durch den Optval-Parameter adressiert wird. Die Spalte "Beschreibung" enthält einige grundlegende Informationen zur Socketoption. Ausführlichere Listen mit Socketoptionen und ausführlichere Informationen (z. B. Standardwerte) finden Sie in den ausführlichen Themen unter "Socketoptionen".
Niveau = SOL_SOCKET
| Wert | Typ | Description |
|---|---|---|
| SO_BROADCAST | BOOL | Konfiguriert einen Socket zum Senden von Übertragungsdaten. |
| SO_CONDITIONAL_ACCEPT | BOOL | Ermöglicht, dass eingehende Verbindungen von der Anwendung akzeptiert oder abgelehnt werden, nicht vom Protokollstapel. |
| SO_DEBUG | BOOL | Aktiviert die Debugausgabe. Microsoft-Anbieter geben derzeit keine Debuginformationen aus. |
| SO_DONTLINGER | BOOL | Sperrt das Schließen nicht, bis nicht gesendete Daten gesendet werden. Das Festlegen dieser Option entspricht dem Festlegen SO_LINGER mit l_onoff auf Null festgelegt. |
| SO_DONTROUTE | BOOL | Legt fest, ob ausgehende Daten über die Schnittstelle gesendet werden sollen, an die der Socket gebunden ist und nicht an eine andere Schnittstelle weitergeleitet wird. 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 beim Schließen, wenn nicht gesendete Daten vorhanden sind. |
| SO_OOBINLINE | BOOL | Gibt an, dass out-of-bound-Daten in Zeile mit regulären Daten zurückgegeben werden sollen. Diese Option ist nur für verbindungsorientierte Protokolle gültig, 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 gesamt reservierten Pufferraum pro Socket an. |
| SO_REUSEADDR | BOOL | Ermöglicht die Bindung des Sockets an eine adresse, die bereits verwendet wird. Weitere Informationen finden Sie unter bind. Gilt nicht für ATM-Sockets. |
| SO_EXCLUSIVEADDRUSE | BOOL | Ermöglicht die Bindung eines Sockets für 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 Gesamtspeicher pro Socketpuffer an, der für Sendesendungen reserviert ist. |
| SO_SNDTIMEO | DWORD | Das Timeout in Millisekunden zum Blockieren von Sendeanrufen. |
| SO_UPDATE_ACCEPT_CONTEXT | UINT_PTR | Aktualisiert den akzeptierenden Socket mit dem Kontext des Überwachungssockets. |
| PVD_CONFIG | Vom Dienstanbieter abhängig | Dieses Objekt speichert die Konfigurationsinformationen für den Dienstanbieter, der Sockets zugeordnet ist. Das genaue Format dieser Datenstruktur ist dienstanbieterspezifisch. |
Niveau = IPPROTO_TCP
Siehe TCP_NODELAY in IPPROTO_TCP Socketoptionen. Lesen Sie auch dieses Thema, um ausführlichere und ausführlichere Informationen zu Socketoptionen für level = IPPROTO_TCP zu finden.
Niveau = NSPROTO_IPX
| Wert | Typ | Description |
|---|---|---|
| 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 Übertragungspakete wahrscheinlich im Socket vorhanden sind. Standardmäßig auf TRUE festgelegt. Anwendungen, die keine Übertragungen verwenden, sollten dies auf FALSE festlegen, um eine bessere Systemleistung zu erzielen. |
| IPX_IMMEDIATESPXACK | BOOL | Directs SPX connections not to delay before sending an ACK. Anwendungen ohne Back-and-Forth-Datenverkehr sollten dies auf TRUE festlegen, um die Leistung zu erhöhen. |
Ausführlichere und ausführlichere Informationen zu Socketoptionen für die Ebene = NSPROTO_IPX finden Sie unter NSPROTO_IPX Socketoptionen.
Die BSD-Optionen für Setsockopt werden in der folgenden Tabelle nicht unterstützt.
| Wert | Typ | Description |
|---|---|---|
| SO_ACCEPTCONN | BOOL | Gibt zurück, ob sich ein Socket im Überwachungsmodus befindet. Diese Option ist nur für verbindungsorientierte Protokolle gültig. Diese Socketoption wird für die Einstellung nicht unterstützt. |
| SO_RCVLOWAT | INT | Eine Socketoption von BSD UNIX ist aus Gründen der Abwärtskompatibilität enthalten. Diese Option legt die Mindestanzahl der Bytes fest, die für Socketeingabevorgänge verarbeitet werden sollen. |
| SO_SNDLOWAT | INT | Eine Socketoption von BSD UNIX ist aus Gründen der Abwärtskompatibilität enthalten. Diese Option legt die Mindestanzahl der Bytes fest, 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 Setsockopt-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 für IrDA-Sockets
Beachten Sie beim Entwickeln von Anwendungen mit Windows-Sockets für IrDA Folgendes:
- Die Headerdatei Af_irda.h muss explizit eingeschlossen werden.
- IrDA bietet die folgende Socketoption:
Wert Typ 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 zuweist.
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, aber dieser Zugriff wird normalerweise nicht von Anwendungen verwendet und besteht in erster Linie zur Unterstützung von Verbindungen mit Nicht-Windows-Geräten, die nicht den IrDA-Konventionen von Windows Sockets 2 entsprechen.
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 SO_ Socketoptionen auf 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 unter 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
| Anforderung | Wert |
|---|---|
| Mindestens unterstützter Client | Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps] |
| mindestens unterstützte Server- | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
| Zielplattform- | Fenster |
| Header | winsock.h (include Winsock2.h) |
| Library | Ws2_32.lib |
| DLL | Ws2_32.dll |