共用方式為


setsockopt 函式 (winsock.h)

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
WSANOTINITIALIZED
使用此函式之前,必須先進行成功的 WSAStartup 呼叫。
WSAENETDOWN
網路子系統發生故障。
WSAEFAULT
optval 參數所指向的緩衝區不在處理程序位址空間的有效部分中,或 optlen 參數太小。
WSAEINPROGRESS
封鎖 Windows Sockets 1.1 呼叫正在進行中,或服務提供者仍在處理回呼函式。
WSAEINVAL
level 參數無效,或 optval 參數所指向的緩衝區中的資訊無效。
WSAENETRESET
設定 SO_KEEPALIVE 時連線已逾時。
WSAENOPROTOOPT
指定的提供者或通訊端未知或不支援此選項 (請參閱 SO_GROUP_PRIORITY限制) 。
WSAENOTCONN
設定 SO_KEEPALIVE 時,連線已重設。
WSAENOTSOCK
描述元不是通訊端。

備註

setsockopt 函式會設定與任何狀態下任何類型的通訊端相關聯的通訊端選項的現行值。 雖然選項可以存在於多個通訊協定層級,但它們一律存在於最上層的通訊端層級。 選項會影響通訊端作業,例如是否在一般資料流程中接收加速資料 (例如 OOB 資料) ,以及是否可以在通訊端上傳送廣播訊息。

便條如果在連結函數之前呼叫 setsockopt 函數,則在連結發生之前,不會使用 TCP/IP 來檢查 TCP/IP 選項。 在此情況下, setsockopt 函式呼叫一律會成功,但 繫結 函式呼叫可能會失敗,因為早期 的 setsockopt 呼叫失敗。
 
便條 如果開啟通訊端、進行 setsockopt 呼叫,然後進行 sendto 呼叫,Windows 通訊端會執行隱含系 函式呼叫。
 
通訊端選項有兩種類型:啟用或停用功能或行為的布林選項,以及需要整數值或結構的選項。 若要啟用布林選項, optval 參數會指向非零整數。 若要停用選項, optval 會指向等於零的整數。 optlen 參數應該等於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 依賴服務提供者 此物件會儲存與通訊端相關聯之服務提供者的組態資訊。 此資料結構的確切格式是服務提供者特定的。
  如需有關 層級 = SOL_SOCKET的通訊端選項的更完整和詳細資訊,請參閱 SOL_SOCKET通訊端選項

= 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,例如設定通訊端類型不支援此通訊端選項。
 
便條 發出封鎖 Winsock 呼叫 (例如 setsockopt) 時,Winsock 可能需要等候網路事件,才能完成呼叫。 Winsock 會在此情況下執行可警示等候,這可能會由相同執行程上排程的非同步程式呼叫 (APC) 中斷。 在中斷相同執行程上進行的封鎖 Winsock 呼叫的 APC 內發出另一個封鎖 Winsock 呼叫,會導致未定義的行為,而且 Winsock 用戶端絕不能嘗試。
 

範例程式碼

下列範例示範 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.1Windows 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

另請參閱

IPPROTO_IP 插座選項

IPPROTO_IPV6 插座選項

IPPROTO_RM 插座選項

IPPROTO_TCP插座選項

IPPROTO_UDP插座選項

NSPROTO_IPX 插座選項

SOL_APPLETALK 插座選項

SOL_IRLMP 插座選項

SOL_SOCKET插座選項

套接字選項

WSAAsyncSelect

WSAEventSelect

WSAIoctl

Winsock 函數

getsockopt

ioctl暫接字

插座