Provided by: manpages-zh_1.5-1_all bug

NAME

       socket - Linux 套接字

`覽
       #include <sys/socket.h>
       mysocket = socket(int socket_family, int socket_type, int protocol);

yz
       本手冊隊雯苳F  Linux  套接字的使用者接口.  這  BSD  相容套接字是介於用
       戶進程與核心網路協議棧之間的統一接口, 各協議模塊屬於不同的    ,如
       PF_INET,  PF_IPX,  PF_PACKETMr ,如r`y]SOCK_STREAMSOCK_DGRAM.  關於協議族和套接字類型請參考 socket(2).

Mh數
       使用者通過這些套接字函數發送和接收包,               以及其他套接字操作.
       詳細說明參看他怞U自的手冊.

       socket(2) 創建套接字,

       connect(2) 與遠程套接字地址建立連接

       bind(2)          把套接字和一茈誚a套接字地址綁定在一起(為套接字分配一-
       茈誚a協議地址)

       listen(2) 通知套接字接受新的連接

       accept(2) 為新的已完成連接獲得新的描z字

       socketpair(2)      返回兩茬s接的匿名套接字(僅在某些本地族中才有實現,如
       PF_UNIXsend(2),

       sendto(2),  和  sendmsg(2) 通過套接字發送數據,而 recv(2), recvfrom(2),
       recvmsg(2) 從套接字接收數據.  poll(2) 和

       select(2)  等待數據到來或準備好接收數據.  除此之外,  標準  I/O   操作如
       write(2),     writev(2),     sendfile(2),    read(2),    和    readv(2)
       也可用來讀入(接收)和寫出(發送)數據.

       getsockname(2) 用於獲得本地套接字地址

       getpeername(2) 用於獲得遠端套接字地址.  getsockopt(2) 和  setsockopt(2)
       用於設置或取得套接字或協議選項.                                ioctl(2)
       也可以用來設置或讀取一些其他選項.

       close(2) 關閉套接字.  shutdown(2) 關閉全雙工套接字連接的一部分.

       套接字不支持搜索,也不支持調用   pread(2)   或   pwrite(2)   進行非   0
       位置的操作.         可以用       fcntl(2).        設置       O_NONBLOCK
       標誌來實現對套接字的非阻塞   I/O   操作    O_NONBLOCK    是從    accept
       繼承來的,然後鴩茤狾雪|阻塞的操作會返回       EAGAIN.        connect(2)
       在此情況下返回 EINPROGRESS 錯誤.  使用者可以通過 poll(2) 或者 select(2)
       等待各種事件.

       +-----------------------------------------------------------+
       |                         I/O 事件                          |
       +------+----------+-----------------------------------------+
       |事件  | 輪詢標誌 | 發生事件                                |
       +------+----------+-----------------------------------------+
       |讀    | POLLIN   | 新數據到達.                             |
       +------+----------+-----------------------------------------+
       |讀    | POLLIN   | (對-                                    |
       |      |          | 惘V連接的套接字)建立連接成冉}           |
       |      |          | 讀:POLLHUP:T{                           |
       |      |          | 另一端套接字發出斷開連接請求.           |
       +------+----------+-----------------------------------------+
       |讀    | POLLHUP  | (僅對-                                  |
       |      |          | 惘V連接協議)套接字寫的時-               |
       |      |          | 堀s接斷開.  同時發送 SIGPIPE.           |
       +------+----------+-----------------------------------------+
       |寫    | POLLOUT  | 套接字有充足的發送緩沖區用於寫入新數據. |
       +------+----------+-----------------------------------------+
       |讀/寫 | POLLIN|  | 發出的 connect(2) 結束.                 |
       |      | POLLOUT  |                                         |
       +------+----------+-----------------------------------------+
       |讀/寫 | POLLERR  | 產生一茞夾B錯誤.                        |
       +------+----------+-----------------------------------------+
       |讀/寫 | POLLHUP  | 對方已經單向關閉連接.                   |
       +------+----------+-----------------------------------------+
       |例外  | POLLPRI  | 緊急數據到達.然後發送 SIGURG.           |
       +------+----------+-----------------------------------------+

       另外一茠    poll/select   方法是讓核心用   SIGIO   信號來通知應用程式.
       n這麼用的話你必須用 fcntl(2)  設置套接字檔案描z符的  FASYNC  標誌,並用
       sigaction(2).  給 SIGIO 信號設置一茠漲陵蘋H號處理句柄.參看下悸 SIGNALS
       的討論.

Mr項
       套接字選項可以用      setsockopt(2)      來設置,用       getsockopt(2)
       讀取所有套接字級別設為 SOL_SOCKET 的套接字的套接字選項:

       SO_KEEPALIVE
              允許在惘V連接的套接字上發送 keep-alive 消息的功能.是一茈牯蜀蒱.

       SO_OOBINLINE
              如果打開這蚇龠窗A帶外(Out-of-Band)數據可以直接放入接收數據流。
              否則,只有接收時打開 MSG_OOB 標誌, 才接收帶外數據.

       SO_RCVLOWATSO_SNDLOWAT
              聲明在開始向協議       (SO_SNDLOWAT)      或正在接收數據的使用者
              (SO_RCVLOWAT).    傳遞數據之前緩沖區內的最小字節數.   在   Linux
              中這兩蚧是不可改變的,   固定為   1   字節.    可以用  getsockopt
              用來讀取它怐瘓; setsockopt 總是返回 ENOPROTOOPT.

       SO_RCVTIMEOSO_SNDTIMEO
              發送和接收時的超時設定, 並在超時時報錯. 在 Linux 中由  協議指定,
              不能被讀寫. 它怐漸\能可用 alarm(2) 或者 setitimer(2).  來模擬.

       SO_BSDCOMPAT
              允許  BSD  的 bug-to-bug 相容. 這一項只能在 UDP 協議模塊中使用而
              且今後將n取消. 如果允許的話, UDP  套接字接收到的  ICMP  錯誤將不
              會被傳送至使用者程式.   Linux   2.0   中對於鴝l套接字也允許  BSD
              bug-to-bug  相容(報頭隨機改變,省略廣播標識),但在   Linux   2.2
              中取消了這一項. 蚹翵洏峈拑{式的方式比較好.

       SO_PASSCRED
              允許或關閉    SCM_CREDENTIALS    控制消息的接收.    更多信息參見
              unix(7).

       SO_PEERCRED
              返回連接至此套接字的外部進程的言鷕蝯.       只在        PF_UNIX
              套接字中有用.參見  unix(7).   參數為 ucred 結構.只在 getsockopt.
              中有效.

       SO_BINDTODEVICE
              將此套接字綁定到一荅S定的設備上,                       如"eth0",
              做為指定的接口名字傳遞.     如果名稱是空字符串或此項長度為    0,
              則套接字設備綁定被取消.          過去的選項是一蚥靰曭漯饕s結尾的
              接口名稱的字符串,      其最大長度為      IFNAMSIZ.       如果一-
              荇M接字被綁定至一接口,                                 只有由這-
              荅S定接口接收的信息包可以由此套接字處理.

       SO_DEBUG
              允許套接字調試.只對有   CAP_NET_ADMIN  功能或有效使用者標識為  0
              的進程有效.

       SO_REUSEADDR
              表示在一 bind(2)  調用中對提供給它的地址使用的確認規則應該允許-
              契_使用本地地址.  對於  PF_INET  套接字, 這表示該套接字可以綁定,
              除非已有一茯ˍD的偵聽套       接口綁定到此地址上.        如果這-
              荌酷幼M接字和一茷定端口綁定為           INADDR_ANY          時,
              它就不能再綁定到任何本地地址的此端口.

       SO_TYPE
              按整數返回套接字類型(如 SOCK_STREAM) 只能通過 getsockopt 讀取.

       SO_DONTROUTE
              不通過網關發送,      只能發送給直接連接的主機.可以通過在套接字的
              send(2)  操作上設置  MSG_DONTROUTE   標誌來實現相同的效果.   其-
              陞牯葦狡蒱獐陏.

       SO_BROADCAST
              設置或獲取廣播標識.      當選擇此選項時,      數據報套接字接收向
              廣播地址發送的數據包,     並且可以向廣播地址發送數據包.     這一
              選項對於惘V流的套接字無效.

       SO_SNDBUF
              設置或得到套接字發送緩沖區的最大字節數.  其預設  wmem_default
              sysctl 設置,最大允許 wmem_max sysctl 設置.

       SO_RCVBUF
              設置或得到套接字接收緩沖區的最大字節數。其預設   rmem_default
              sysctl設置,最大允許 rmem_max sysctl 設置.

       SO_LINGER
              設置或獲取 SO_LINGER 選項的. 其參數為 linger 結構.

              struct linger {
                  int   l_onoff;    /* 延時狀態(打開/關閉) */
                  int   l_linger;   /* 延時多長時間 */
              };

              如果選擇此選項,          close(2)         或         shutdown(2)
              將等到所有套接字裏排隊的消息成功發送或到達延遲時間後   才會返回.
              否則,  調用將立即返回. 而 closing 操作將在I景 進行. 如果套接字是
              exit(2), 的一部分關閉時, 它總是在I景延遲進行的.

       SO_PRIORITY
              設置在此套接字發送的所有包的協議定義優先權.    Linux   通過這一-
              荓C網路隊列:                           根據所選設備排隊規則,
              具有更高優先權的包可以先被處理.對於 ip(7),  同時也設置了輸出包的
              IP 服務類型(TOS)的域.

       SO_ERROR
              取得並清除未解決的套接字錯誤.  只有在 getsockopt.  時有效. 是一-
              蚞蒱.

SIGNALS

       當向一茪w關閉(被本地或遠程終端)的惘V聯接的套接字寫入時,
       將向該寫入進程發送   SIGPIPE   信號,並返回   EPIPE  如果寫入命令聲明了
       MSG_NOSIGNAL 標識時, 不會發出此信號.

       如果與 FIOCSETOWN fcntl 或  SIOCSPGRP  ioctl  一起請求,那麼當發生  I/O
       事件時發出  SIGIO  這樣我抴N可以在信號句柄裏使用  poll(2)  或 select(2)
       找出發生事件的套接字.  另一種選擇(在 Linux 2.2 中)是用 F_SETSIG fcntl
       設置一蚢禤伎H號:  實時信號的處理程式被調用時還會收到它的  siginfo_tsi_fd 區域中的檔案描z符.  更多信息參見 fcntl(2)

       在某些環境中(例如:多荈i程訪問單荇M接字),          引發          SIGIO
       的東西在進程對信號作出反應時可能已經消失了.               如果這樣的話,
       進程應該再次等待, 因為 Linux 稍後會奏o此信號.

SYSCTLS

       可以通過目錄     /proc/sys/net/core/*     下的檔案或者用      sysctl(2)
       系統調用來訪問核心套接字的網路系統控制(sysctl)信息.

       rmem_default
              指明套接字接收緩沖區的預設字節數.

       rmem_max
              指明套接字接收緩沖區的最大字節數,  使用者可以通過使用  SO_RCVBUF
              套接字選項來設置此.

       wmem_default
              指明套接字發送緩沖區的預設字節數.

       wmem_max
              指明發送緩沖區的最大字節數,使用者可以通過使用套接字的 SO_SNDBUF
              選項來設置它的.

       message_costmessage_burst
              設定記號存儲桶過濾器,  在存儲桶中保存一定數量的外部網路  事件導-
              P的警告消息.

       netdev_max_backlog
              在全局輸入隊列中包的最大數目.

       optmem_max
              每荇M接字的像 iovecs 這樣的輔助數據和使用者控制數據的最大長度.

IOCTLS

       以上的 IO 控制i以通過 ioctl(2) 來訪問:

              error = ioctl(ip_socket, ioctl_type, &value_result);

       SIOCGSTAMP
              返回     timeval     類型的結構,其中包括有發送給使用者的最後一-
              茈]接收時的時間戳。  被用來測量精確的  RTT  (round  trip time)
              時間.  struct timeval.  結構說明請參考 setitimer(2)

       SIOCSPGRP
              在異步  IO  操作結束或者接收到緊急數據時,用來設置進程或進程組,
              向它(它怴^發送   SIGIO  或者  SIGURG  信號,  參數為指向  pid_t.
              類型的指針。如果參數為正,則發送信號到相應的進程。如果參數為
              t,則發送信號到此參數絕對      id      所屬的進程組的所有進程。
              如果它沒有    CAP_KILL    功能或者它的有效    UID    不是     0,
              進程只能選擇它自己或自己的進程組來 接收信號.

       FIOASYNC
              改變       O_ASYNC       標誌來打開或者關閉套接字的異步       IO
              模式。異步IO模式指的是:當  新的  I/O  事件發生時,將發出  SIGIO
              信號或者用 F_SETSIG 設置的信號.

              參數為整形布爾量.

       SIOCGPGRP
              獲得當前接收  SIGIO  或者  SIGURG  信號的進程或者進程組, 如果兩-
              茷H號都沒有設置, 則為 0.

       有效的 fcntl:

       FIOCGETOWN
              與 IO 控制中的 SIOCGPGRP 相同.

       FIOCSETOWN
              與 IO 控制中的 SIOCSPGRP 相同.

`N
       Linux       假設有一半的發送/接收緩沖區是用來處理核心結構,        因此,
       系統控制的緩沖區是網路可訪問的緩沖區的兩.

陷
       CONFIG_FILTER 沒有介紹 SO_ATTACH_FILTERSO_DETACH_FILTER 套接字選項.
       在 libpcap 庫有此接口的說明

VERSIONS本
       SO_BINDTODEVICE 在 Linux 2.0.30 中引入.   SO_PASSCRED  是在  Linux  2.2
       中引入的新選項.  sysctl 是在 Linux 2.2. 中引入的新概念。

@者
       本手冊階 Andi Kleen 編寫.

S見
       socket(2), ip(7), setsockopt(2), getsockopt(2), packet(7), ddp(7)

[]
       liguoping <liguoping_11@sina.com>

[]
       2000/11/06

mlinuxan:
       http://cmpp.linuxforum.net