1. 程式人生 > >[通訊協議] [Socket程式設計] socket()函式使用講解

[通訊協議] [Socket程式設計] socket()函式使用講解

一.前言        

        當我們進行socket程式設計時,要呼叫各種socket函式,而且還需要用到一個庫檔案 Ws2_32.lib 和一個頭檔案 Winsock2.h。

二.講解

     1.函式的功能

  • socket()函式 

        int socket(int domain, int type, int protocol);

        socket()函式的原型如下,這個函式建立一個協議族為domain、協議型別為type、協議編號為protocol的套接字檔案描述符。如果函式呼叫成功,會返回一個標識這個套接字的檔案描述符,失敗的時候返回-1。 

2.函式使用     

        1).socket()

     ①原型:

int socket(int domain, int type, int protocol);

     ②引數:

  1. domain用於設定網路通訊的域,函式socket()根據這個引數選擇通訊協議的族。通訊協議族在檔案sys/socket.h中定義。

                                                                      表1 domain的值及含義

    名稱 含義 名稱 含義
    PF_UNIX,PF_LOCAL 本地通訊 PF_X25 ITU-T X25 / ISO-8208協議
    AF_INET,PF_INET IPv4 Internet協議 PF_AX25 Amateur radio AX.25
    PF_INET6 IPv6 Internet協議 PF_ATMPVC 原始ATM PVC訪問
    PF_IPX IPX-Novell協議 PF_APPLETALK Appletalk
    PF_NETLINK 核心使用者介面裝置 PF_PACKET 底層包訪問
  2. type
    函式socket()的引數type用於設定套接字通訊的型別,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(資料包套接字)等。  

                                                                         表2 type的值及含義

    名稱 含義
    SOCK_STREAM Tcp連線,提供序列化的、可靠的、雙向連線的位元組流。支援帶外資料傳輸
    SOCK_DGRAM 支援UDP連線(無連線狀態的訊息)
    SOCK_SEQPACKET 序列化包,提供一個序列化的、可靠的、雙向的基本連線的資料傳輸通道,資料長度定常。每次呼叫讀系統呼叫時資料需要將全部資料讀出
    SOCK_RAW RAW型別,提供原始網路協議訪問
    SOCK_RDM 提供可靠的資料報文,不過可能資料會有亂序
    SOCK_PACKET 這是一個專用型別,不能呢過在通用程式中使用
    並不是所有的協議族都實現了這些協議型別,例如,AF_INET協議族就沒有實現SOCK_SEQPACKET協議型別。

     ③.舉例

               假如一個程式要使用2.1版本的Socket,那麼程式程式碼如下 

wVersionRequested = MAKEWORD( 2, 1 ); 
err = WSAStartup( wVersionRequested, &wsaData );

        2).WSACleanup()

      ①.原型:

   int WSACleanup (void); 

三.擴充套件

     1.WSADATA資料型別

        1)功能

                    這個結構被用來儲存。被WSAStartup函式呼叫後返回的 Windows Sockets資料。它包含Winsock.dll執行的資料。

   2)結構原型  

struct WSAData 
{

  WORD wVersion;

  WORD wHighVersion;

  char szDescription[WSADESCRIPTION_LEN+1];

  char szSystemStatus[WSASYSSTATUS_LEN+1];

  unsigned short iMaxSockets;

  unsigned short iMaxUdpDg;

  char *lpVendorInfo;
};

  WSADATA結構被用來儲存函式WSAStartup返回的Windows Sockets初始化資訊。

  3)成員

  1. wVersion                   Windows Sockets DLL期望呼叫者使用的Windows Sockets規範的版本。 高位位元組儲存副版本號, 低位位元組儲存主版本號,可以用WORD MAKEWORD(BYTE,BYTE ) 返回這個值,例如:MAKEWORD(1,1)  
  2. wHighVersion                  這個DLL能夠支援的Windows Sockets規範的最高版本。通常它與wVersion相同。  
  3. szDescription                  以null結尾的ASCII字串,Windows Sockets DLL將對Windows Sockets實現的描述拷貝到這個字串中,包括製造商標識。文字(最多可以有256個字元)可以包含任何字元,但是要注意不能包含控制字元和格式字元,應用程式對其最可能的使用方式是把它(可能被截斷)顯示在在狀態資訊中。  
  4. szSystemStatus                  以null結尾的ASCII字串,Windows Sockets DLL把有關的狀態或配置資訊拷貝到該字串中。Windows Sockets DLL應當僅在這些資訊對使用者或支援人員有用時才使用它們,它不應被作為szDescription域的擴充套件。  
  5. iMaxSockets單個程序能夠開啟的socket的最大數目。Windows Sockets的實現能提供一個全域性的socket池,可以為任何程序分配;或者它也可以為socket分配屬於程序的資源。這個數字能夠很好地反映Windows Sockets DLL或網路軟體的配置方式。應用程式的編寫者可以通過這個數字來粗略地指明Windows Sockets的實現方式對應用程式是否有用。例如,X Windows伺服器在第一次啟動的時候可能會檢查iMaxSockets的值:如果這個值小於8,應用程式將顯示一條錯誤資訊,指示使用者重新配置網路軟體(這是一種可能要使用szSystemStatus文字的場合)。顯然無法保證某個應用程式能夠真正分配iMaxSockets個socket,因為可能有其它WindowsSockets應用程式正在使用。  
  6. iMaxUdpDg                 Windows Sockets應用程式能夠傳送或接收的最大的使用者資料包協議(UDP)的資料包大小,以位元組為單位。如果實現方式沒有限制,那麼iMaxUdpDg為零。在Berkeley sockets的許多實現中,對於UDP資料包有個固有的限制(在必要時被分解),大小為8192位元組。Windows Sockets的實現可以對碎片重組緩衝區的分配作出限制。對於適合的WindowsSockets 實現,iMaxUdpDg的最小值為512。注意不管iMaxUdpDg的值是什麼,都不推薦你發回一個比網路的最大傳送單元(MTU)還大的廣播資料包。(Windows Sockets API 沒有提供發現MTU的機制,但是它不會小於512個位元組)。WinSock2.0版中已被廢棄。  
  7. lpVendorInfo                  指向銷售商的資料結構的指標。這個結構的定義(如果有)超出了WindowsSockets規範的範圍。WinSock2.0版中已被廢棄。