Can you summarize the following document?
        
  Berkeley套接字介面,一個應用程式介面(API),使用一個Internet套接字的概念,使主機間或者一臺計算機上的程序間可以通訊。 它可以在很多不同的輸入/輸出裝置和驅動之上執行,儘管這有賴於作業系統的具體實現。 介面實現用於TCP/IP協議,因此它是維持Internet的基本技術之一。 它是由加利福尼亞的伯克利大學開發,最初用於Unix系統。 如今,所有的現代作業系統都有一些源於Berkeley套接字介面的實現,它已成為連線Internet的標準介面。  套接字介面的接入有三個不同的級別,最基礎的也是最有效的就是raw socket級別接入。 很少的應用程式需要在外向通訊控制的這個級別接入,所以raw socket級別是只為了用於開發計算機Internet相關技術的。 最近幾年,大多數的作業系統已經實現了對它的全方位支援,包括Windows XP。

  由於Berkeley套接字是第一個socket,大多數程式設計師很熟悉它們,所以大量系統把伯克利套接字作為其主要的網路API。一個不完整的列表如下:

  Berkeley套接字介面的定義在幾個標頭檔案中。這些檔案的名字和內容與具體的實現之間有些許的不同。 大體上包括:

  這個列表是一個Berkeley套接字API庫提供的函式或者方法的概要:  更多的細節如下給出。

  codice_6 為通訊建立一個端點,為套接字返回一個檔案描述符。 socket() 有三個引數:  如果發生錯誤,函式返回值為-1。 否則,函式會返回一個代表新分配的描述符的整數。

  codice_7 為一個套接字分配地址。當使用codice_6建立套接字後,只賦予其所使用的協議,並未分配地址。在接受其它主機的連線前,必須先呼叫bind()</code>為套接字分配一個地址。codice_7有三個引數: 如果發生錯誤,函式返回值為-1,否則為0。

  當socket和一個地址繫結之後,codice_8函式會開始監聽可能的連線請求。然而,這只能在有可靠資料流保證的時候使用,例如:資料型別(codice_28, codice_30)。  listen()函式需要兩個引數:  一旦連線被接受,返回0表示成功,錯誤返回-1。  原型:

  當應用程式監聽來自其他主機的面對資料流的連線時,通過事件(比如Unix select()系統呼叫)通知它。必須用 codice_10函式初始化連線。 Accept() 為每個連線創立新的套接字並從監聽佇列中移除這個連線。它使用如下引數:  返回新的套接字描述符,出錯返回-1。進一步的通訊必須通過這個套接字。  Datagram 套接字不要求用accept()處理,因為接收方可能用監聽套接字立即處理這個請求。

  codice_9系統呼叫為一個套接字設定連線,引數有檔案描述符和主機地址。  某些型別的套接字是無連線的,大多數是UDP協議。對於這些套接字,連線時這樣的:預設傳送和接收資料的主機由給定的地址確定,可以使用 send()和 recv()。 返回-1表示出錯,0表示成功。

  int select (int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout);

  int getsockname (SOCKET s, struct sockaddr *name, int* namelen); getsockname函式獲取已繫結(可能是未呼叫bind的系統自動繫結)的套介面本地協議地址。 getpeername函式獲得與指定套介面連線的遠端資訊(IP:PORT)。

  codice_18 和 codice_19函式是用來解析主機名和地址的。可能會使用DNS服務或者本地主機上的其他解析機制(例如查詢/etc/hosts)。返回一個指向 struct hostent的指標,這個結構體描述一個IP主機。函式使用如下引數:  出錯返回NULL指標,可以通過檢查 h_errno 來確定是臨時錯誤還是未知主機。正確則返回一個有效的 struct hostent *。  這些函式並不是伯克利套接字嚴格的組成部分。這些函式可能是過時了,只能處理IPv4地址。在IPv6中,替代的新函式是 getaddrinfo() and getnameinfo(), 這些新函式是基於"addrinfo"資料結構。參考<Ws2tcpip.h>。

  int setsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); --設定套接字選項 引數: 在socket層, 有以下一些選項:

  int ioctlsocket(_In_ SOCKET s, _In_ long cmd, _Inout_ u_long *argp); 根據第二個引數的取值,設定socket I/O模式:

  inet_pton與inet_ntop兩個函式,在ASCII字元描述的IP地址與網路位元組序的4位元組IP地址之間轉換。 字母"n"與"p",分別是numerical與presentation的縮寫。

  套接字API是Unix網路的通用介面,允許使用各種網路協議和地址。  下面列出了一些例子,在現在的 Linux 和 BSD 中一般都已經實現了。  socket的通用address描述結構sockaddr是一個16位元組大小的結構(2+14),sa_family可以認為是socket address family的縮寫。另外的14位元組是用來描述地址。當指定sa_family=AF_INET之後,sa_data的形式也就被固定了下來:最前端的2位元組用於記錄16位的埠,緊接著的4位元組用於記錄32位的IP地址,最後的8位元組清空為零。

  

  設定一個簡單的TCP伺服器涉及下列步驟: Python實現:

  建立一個客戶機連線涉及以下步驟:  Python實現:

  使用者資料包協議(UDP)是一個不保證正確傳輸的無連線協議。 UDP資料包可能會亂序到達,多次到達或者直接丟失。但是設計的負載比TCP小。  UDP地址空間,也即是UDP埠,和TCP埠是沒有關係的。

  Code may set up a UDP server on port 7654 as follows:  上面的無限迴圈用recvfrom()接收給UDP埠7654的資料包。使用如下引數:  同樣功能的Python實現:

  用UDP資料包傳送一個"Hello World!" 給地址127.0.0.1(迴環地址),埠 7654 。  codice_66指定要傳送資料的指標, codice_67指定快取內容的大小。  同樣功能的Python實現:

  The "de jure" standard definition of the Sockets interface is contained in the POSIX standard, known as:  Information about this standard and ongoing work on it is available from the Austin website.  The IPv6 extensions to the base socket API are documented in RFC 3493 and RFC 3542.
伯克利套接字(英語:Internet Berkeley sockets),又稱為BSD 套接字(英語:BSD sockets)是一種應用程式介面(API),用於網路套接字( socket)與Unix域套接字,包括了一個用C語言寫成的應用程式開發庫,主要用於實現程序間通訊,在計算機網路通訊方面被廣泛使用。