setsockopt 函數設定通訊端選項。
語法
int setsockopt(
[in] SOCKET s,
[in] int level,
[in] int optname,
[in] const char *optval,
[in] int optlen
);
參數
[in] s
識別通訊端的描述元。
[in] level
定義選項的層級 (例如,SOL_SOCKET)。
[in] optname
要設定值的套接字選項 (例如,SO_BROADCAST)。 optname 參數必須是在指定層次內定義的通訊端選項,否則行為未定義。
[in] optval
指定所要求選項值之緩衝區的指標。
[in] optlen
optval 參數所指向的緩衝區大小 (以位元組為單位)。
傳回值
如果未發生錯誤,則 setsockopt 會傳回零。 否則,會傳回 SOCKET_ERROR 的值,而且可以呼叫 WSAGetLastError 來擷取特定的錯誤碼。
| 錯誤碼 | Meaning |
|---|---|
| 使用此函式之前,必須先進行成功的 WSAStartup 呼叫。 | |
| 網路子系統發生故障。 | |
| optval 參數所指向的緩衝區不在處理程序位址空間的有效部分中,或 optlen 參數太小。 | |
| 封鎖 Windows Sockets 1.1 呼叫正在進行中,或服務提供者仍在處理回呼函式。 | |
| level 參數無效,或 optval 參數所指向的緩衝區中的資訊無效。 | |
| 設定 SO_KEEPALIVE 時連線已逾時。 | |
| 指定的提供者或通訊端未知或不支援此選項 (請參閱 SO_GROUP_PRIORITY限制) 。 | |
| 設定 SO_KEEPALIVE 時,連線已重設。 | |
| 描述元不是通訊端。 |
備註
setsockopt 函式會設定與任何狀態下任何類型的通訊端相關聯的通訊端選項的現行值。 雖然選項可以存在於多個通訊協定層級,但它們一律存在於最上層的通訊端層級。 選項會影響通訊端作業,例如是否在一般資料流程中接收加速資料 (例如 OOB 資料) ,以及是否可以在通訊端上傳送廣播訊息。
sizeof(int)布林選項。 對於其他選項, optval 指向包含選項所需值的整數或結構,而 optlen 是整數或結構的長度。
下表列出 setsockopt 函式支援的一些常見選項。 類型直欄會識別 optval 參數所定址的資料類型。 「描述」欄提供通訊端選項的一些基本資訊。 如需更完整的通訊端選項清單和更詳細的資訊 (例如預設值) ,請參閱 通訊端選項下的詳細主題。
平 = SOL_SOCKET
| 價值觀 | 類型 | Description |
|---|---|---|
| SO_BROADCAST | 布爾 | 設定用於傳送廣播資料的通訊端。 |
| SO_CONDITIONAL_ACCEPT | 布爾 | 啟用應用程式接受或拒絕傳入連線,而不是通訊協定堆疊。 |
| SO_DEBUG | 布爾 | 啟用偵錯輸出。 Microsoft 提供者目前不會輸出任何偵錯資訊。 |
| SO_DONTLINGER | 布爾 | 不封鎖關閉等待傳送未傳送的資料。 設定此選項相當於將 l_onoff 設定為零的SO_LINGER。 |
| SO_DONTROUTE | 布爾 | 設定是否應該在通訊端系結的介面上傳送傳出資料,而不是在其他介面上路由傳送。 ATM套接字不支援此選項(導致錯誤)。 |
| SO_GROUP_PRIORITY | int | 保留的。 |
| SO_KEEPALIVE | 布爾 | 啟用傳送通訊端連線的保持連線封包。 ATM套接字不支援(導致錯誤)。 |
| SO_LINGER | 徘徊 | 如果存在未傳送的資料,則在關閉時停留。 |
| SO_OOBINLINE | 布爾 | 指出越界資料應該與一般資料內嵌傳回。 此選項僅適用於支援頻外資料的連線導向通訊協定。 如需此主題的討論,請參閱 通訊協定獨立頻外資料。 |
| SO_RCVBUF | int | 指定保留給接收的每個通訊端緩衝區空間總計。 |
| SO_REUSEADDR | 布爾 | 允許將通訊端繫結至已在使用的位址。 如需詳細資訊,請參閱 繫結。 不適用於自動櫃員機插座。 |
| SO_EXCLUSIVEADDRUSE | 布爾 | 可讓通訊端繫結為獨佔存取。 不需要管理權限。 |
| SO_RCVTIMEO | DWORD | 設定封鎖接收呼叫的逾時 (以毫秒為單位)。 |
| SO_SNDBUF | int | 指定為傳送保留的每個通訊端緩衝區空間總計。 |
| SO_SNDTIMEO | DWORD | 封鎖傳送呼叫的逾時 (以毫秒為單位)。 |
| SO_UPDATE_ACCEPT_CONTEXT | UINT_PTR | 使用接聽通訊端的內容更新接受通訊端。 |
| PVD_CONFIG | 依賴服務提供者 | 此物件會儲存與通訊端相關聯之服務提供者的組態資訊。 此資料結構的確切格式是服務提供者特定的。 |
平 = IPPROTO_TCP
請參閱IPPROTO_TCP套接字選項中的TCP_NODELAY。 另請參閱該主題,以取得 層次 = IPPROTO_TCP的通訊端選項的更完整且詳細資訊。
平 = NSPROTO_IPX
| 價值觀 | 類型 | Description |
|---|---|---|
| IPX_PTYPE | int | 設定IPX封包型別。 |
| IPX_FILTERPTYPE | int | 設定接收篩選封包類型 |
| IPX_STOPFILTERPTYPE | int | 停止篩選使用 IPX_FILTERTYPE 設定的篩選器類型 |
| IPX_DSTYPE | int | 設定每個傳送資料包的 SPX 標頭中資料流欄位的值。 |
| IPX_EXTENDED_ADDRESS | 布爾 | 設定是否啟用延伸定址。 |
| IPX_RECVHDR | 布爾 | 設定通訊協定標頭是否在所有接收標頭上傳送。 |
| IPX_RECEIVE_BROADCAST | 布爾 | 表示廣播封包可能位於通訊端上。 預設設定為 TRUE 。 不使用廣播的應用程式應該將此設定為 FALSE ,以獲得更好的系統效能。 |
| IPX_IMMEDIATESPXACK | 布爾 | 指示 SPX 連線在傳送 ACK 之前不要延遲。 沒有來回流量的應用程式應該將此設定為 TRUE 以提高效能。 |
如需有關 層級 = NSPROTO_IPX的通訊端選項的更完整和詳細資訊,請參閱 NSPROTO_IPX通訊端選項。
下表顯示 setsockopt 不支援的 BSD 選項。
| 價值觀 | 類型 | Description |
|---|---|---|
| SO_ACCEPTCONN | 布爾 | 傳回通訊端是否處於接聽模式。 此選項僅對連線導向通訊協定有效。 此設定不支援此通訊端選項。 |
| SO_RCVLOWAT | int | 包含 BSD UNIX 的套接字選項,以向後相容。 此選項會設定要處理通訊端輸入作業的最小位元組數。 |
| SO_SNDLOWAT | int | 包含 BSD UNIX 的套接字選項,以向後相容。 此選項會設定要處理通訊端輸出作業的最小位元組數。 |
| SO_TYPE | int | 傳回指定通訊端的通訊端類型 (SOCK_STREAM 或 SOCK_DGRAM,例如設定通訊端類型不支援此通訊端選項。 |
範例程式碼
下列範例示範 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;
}
IrDA 插槽注意事項
使用適用於 IrDA 的 Windows 通訊端開發應用程式時,請注意下列事項:
- 必須明確包含 Af_irda.h 標頭檔。
- IrDA 提供下列通訊端選項:
價值觀 類型 Meaning IRLMP_IAS_SET *IAS_SET 設定 IAS 屬性
IRLMP_IAS_SET 通訊端選項可讓應用程式在本機 IAS 中設定單一類別的單一屬性。 應用程式會指定要設定的類別、屬性及屬性類型。 應用程式預期會為傳遞的參數配置必要大小的緩衝區。
IrDA 提供 IAS 資料庫,可儲存 IrDA 型資訊。 透過 Windows Sockets 2 介面可取得 IAS 資料庫的有限存取權,但應用程式通常不會使用這類存取權,而且主要是為了支援與不符合 Windows Sockets 2 IrDA 慣例的非 Windows 裝置連線。
下列結構 IAS_SET 會與 IRLMP_IAS_SET setsockopt 選項搭配使用,以管理本機 IAS 資料庫:
// #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;
下列結構 IAS_QUERY 會與 IRLMP_IAS_QUERY setsockopt 選項搭配使用,以查詢對等的 IAS 資料庫:
// #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;
許多SO_層級通訊端選項對 IrDA 沒有意義。 只有SO_LINGER特別支援。
Windows 電話 8: Windows Phone 8 和更新版本上的 Windows Phone 市集應用程式支援此功能。
Windows 8.1 和 Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 和更新版本上的 Windows 市集應用程式支援此功能。
需求
| Requirement | 價值觀 |
|---|---|
| 最低支援的用戶端 | Windows 8.1、Windows Vista [傳統型應用程式 |UWP 應用程式] |
| 支援的最低伺服器 | Windows Server 2003 [傳統型應用程式 |UWP 應用程式] |
| 目標平臺 | 窗戶 |
| Header | winsock.h(包括 Winsock2.h) |
| Library | Ws2_32.lib |
| DLL檔案 | Ws2_32.dll |