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

NAME

       socket - Linux 套接字

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

述
       本手册页介绍了  Linux  套接字的用户接口.  这个  BSD  兼容套接字是介于用
       户进程与内核网络幸檎恢涞耐骋唤涌,  各幸槟?槭粲诓煌      ,如
       PF_INET,  PF_IPX,  PF_PACKET ,如SOCK_STREAMOCK_DGRAM.  关于幸樽搴吞捉幼掷嘈颓氩慰 socket(2).

数
       用户通过这些套接字函数发送和接收包,                 以及其他套接字操作.
       详细说明参看他们各自的手册页.

       socket(2) 创建套接字,

       connect(2) 与远程套接字地址建立连接

       bind(2)  把套接字和一个本地套接字地址绑定在一起(为套接字分配一个本地-
       议地址)

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

       accept(2) 为新的已完成连接获得新的描述字

       socketpair(2)     返回两个连接的匿名套接字(仅在某些本地族中才有实现,如
       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   | (对面向连接的套接字)建立连接成功        |
       +------+----------+-----------------------------------------+
       |读    | POLLHUP  | 另一端套接字发出断开连接请求.           |
       +------+----------+-----------------------------------------+
       |读    | POLLHUP  | (仅对面向连接-                         |
       |      |          | 议)套接字写的时候连接断开.              |
       |      |          | 同时发送 SIGPIPE.                       |
       +------+----------+-----------------------------------------+
       |写    | POLLOUT  | 套接字有充足的发送缓冲区用于写入新数据. |
       +------+----------+-----------------------------------------+
       |读/写 | POLLIN|  | 发出的 connect(2) 结束.                 |
       |      | POLLOUT  |                                         |
       +------+----------+-----------------------------------------+
       |读/写 | POLLERR  | 产生一个异步错误.                       |
       +------+----------+-----------------------------------------+
       |读/写 | POLLHUP  | 对方已镜ハ蚬乇樟.                    |
       +------+----------+-----------------------------------------+
       |例外  | POLLPRI  | 紧急数据到达.然后发送 SIGURG.           |
       +------+----------+-----------------------------------------+

       另外一个的   poll/select   方法是让内核用   SIGIO   信号来通知应用程序.
       要这么用的话你必须用 fcntl(2) 设置套接字文件描述符的 FASYNC  标志,并用
       sigaction(2).    给   SIGIO   信号设置一个的有效信号处理句柄.参看下面的
       SIGNALS 的讨论.

项
       套接字选项可以用      setsockopt(2)      来设置,用       getsockopt(2)
       读取所有套接字级别设为 SOL_SOCKET 的套接字的套接字选项:

       SO_KEEPALIVE
              允许在面向连接的套接字上发送                          keep-alive
              消息的功能.是一个布尔整数.

       SO_OOBINLINE
              如果打开这个选项,带外(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  幸槟?橹惺褂枚
              且今后将要取消.  如果允许的话,  UDP 套接字接收到的 ICMP 错误将不
              会被传送至用户程序.   Linux   2.0   中对于允继捉幼忠苍市    BSD
              bug-to-bug   兼容(报头随机改变,省略广播标识),但在   Linux  2.2
              中取消了这一项. 修改用户程序的方式比较好.

       SO_PASSCRED
              允许或关闭   SCM_CREDENTIALS    控制消息的接收.     更多信息参见
              unix(7).

       SO_PEERCRED
              返回连接至此套接字的外部进程的身份验证.       只在       PF_UNIX
              套接字中有用.参见 unix(7).  参数为 ucred  结构.只在  getsockopt.
              中有效.

       SO_BINDTODEVICE
              将此套接字绑定到一个特定的设备上,                      如"eth0",
              做为指定的接口名字传递.    如果名称是空字符串或此项长度为     0,
              则套接字设备绑定被取消.         过去的选项是一个变长的空零结尾的
              接口名称的字符串,             其最大长度为             IFNAMSIZ.
              如果一个套接字被绑定至一接口,
              只有由这个特定接口接收的信息包可以由此套接字处理.

       SO_DEBUG
              允许套接字调试.只对有   CAP_NET_ADMIN   功能或有效用户标识为   0
              的进程有效.

       SO_REUSEADDR
              表示在一个                                               bind(2)
              调用中对提供给它的地址使用的确认规则应该允许重复使用本地地址.
              对于        PF_INET        套接字,       这表示该套接字可以绑定,
              除非已有一个活跃的侦听套                     接口绑定到此地址上.
              如果这个侦听套接字和一个指定端口绑定为       INADDR_ANY      时,
              它就不能再绑定到任何本地地址的此端口.

       SO_TYPE
              按整数返回套接字类型(如 SOCK_STREAM) 只能通过 getsockopt 读取.

       SO_DONTROUTE
              不通过网关发送,      只能发送给直接连接的主机.可以通过在套接字的
              send(2)    操作上设置    MSG_DONTROUTE     标志来实现相同的效果.
              其值为布尔型整数的标识.

       SO_BROADCAST
              设置或获取广播标识.      当选择此选项时,      数据报套接字接收向
              广播地址发送的数据包,     并且可以向广播地址发送数据包.     这一
              选项对于面向流的套接字无效.

       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 操作将在后台 进行. 如果套接字是
              exit(2), 的一部分关闭时, 它总是在后台延迟进行的.

       SO_PRIORITY
              设置在此套接字发送的所有包的幸槎ㄒ逵畔热.                 Linux
              通过这一值来排列网络队列:                  根据所选设备排队规则,
              具有更高优先权的包可以先被处理.对于 ip(7),  同时也设置了输出包的
              IP 服务类型(TOS)的域.

       SO_ERROR
              取得并清除未解决的套接字错误.    只有在   getsockopt.    时有效.
              是一个整数值.

SIGNALS

       当向一个已关闭(被本地或远程终端)的面向联接的套接字写入时,
       将向该写入进程发送   SIGPIPE   信号,并返回   EPIPE  如果写入命令声明了
       MSG_NOSIGNAL 标识时, 不会发出此信号.

       如果与 FIOCSETOWN fcntl 或  SIOCSPGRP  ioctl  一起请求,那么当发生  I/O
       事件时发出  SIGIO  这样我们就可以在信号句柄里使用  poll(2) 或 select(2)
       找出发生事件的套接字.  另一种选择(在 Linux 2.2 中)是用 F_SETSIG fcntl
       设置一个实时信号:  实时信号的处理程序被调用时还会收到它的  siginfo_tsi_fd 区域中的文件描述符.  更多信息参见 fcntl(2)

       在某些环境中(例如:多个进程访问单个套接字),         引发         SIGIO
       的东西在进程对信号作出反应时可能已鞠Я.                如果这样的话,
       进程应该再次等待, 因为 Linux 稍后会重发此信号.

SYSCTLS

       可以通过目录     /proc/sys/net/core/*     下的文件或者用      sysctl(2)
       系统调用来访问内核套接字的网络系统控制(sysctl)信息.

       rmem_default
              指明套接字接收缓冲区的默认字节数.

       rmem_max
              指明套接字接收缓冲区的最大字节数,   用户可以通过使用   SO_RCVBUF
              套接字选项来设置此值.

       wmem_default
              指明套接字发送缓冲区的默认字节数.

       wmem_max
              指明发送缓冲区的最大字节数,用户可以通过使用套接字的   SO_SNDBUF
              选项来设置它的值.

       message_costmessage_burst
              设定记号存储桶过滤器,           在存储桶中保存一定数量的外部网络
              事件导致的警告消息.

       netdev_max_backlog
              在全局输入队列中包的最大数目.

       optmem_max
              每个套接字的象 iovecs 这样的辅助数据和用户控制数据的最大长度.

IOCTLS

       以上的 IO 控制值可以通过 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.
              类型的指针。如果参数为正,则发送信号到相应的进程。如果参数为
              负,则发送信号到此参数绝对值     id     所属的进程组的所有进程。
              如果它没有     CAP_KILL    功能或者它的有效    UID    不是    0,
              进程只能选择它自己或自己的进程组来 接收信号.

       FIOASYNC
              改变       O_ASYNC       标志来打开或者关闭套接字的异步       IO
              模式。异步IO模式指的是:当  新的  I/O  事件发生时,将发出  SIGIO
              信号或者用 F_SETSIG 设置的信号.

              参数为整形布尔量.

       SIOCGPGRP
              获得当前接收    SIGIO    或者    SIGURG    信号的进程或者进程组,
              如果两个信号都没有设置, 则为 0.

       有效的 fcntl:

       FIOCGETOWN
              与 IO 控制中的 SIOCGPGRP 相同.

       FIOCSETOWN
              与 IO 控制中的 SIOCSPGRP 相同.

意
       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 编写.

见
       socket(2), ip(7), setsockopt(2), getsockopt(2), packet(7), ddp(7)

[liguoping <liguoping_11@sina.com>

[2000/11/06

linuxan:
       http://cmpp.linuxforum.net