socket linux
来源:互联网 发布:齐次矩阵性质 编辑:程序博客网 时间:2024/05/17 07:34
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_STREAM) 或 数据报(SOCK_DGRAM). 关于协议族和套接字类型请参考 socket(2).
套接层函数
用户通过这些套接字函数发送和接收包, 以及其他套接字操作. 详细说明参看他们各自的手册页.
socket(2) 创建套接字,
connect(2) 与远程套接字地址建立连接
bind(2) 把套接字和一个本地套接字地址绑定在一起(为套接字分配一个本地协议地址)
listen(2) 通知套接字接受新的连接
accept(2) 为新的已完成连接获得新的描述字
socketpair(2) 返回两个连接的匿名套接字(仅在某些本地族中才有实现,如 PF_UNIX)
send(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| POLLOUT | 发出的 connect(2) 结束. |
读/写 | POLLERR | 产生一个异步错误. |
读/写 | POLLHUP | 对方已经单向关闭连接. |
例外 | POLLPRI | 紧急数据到达.然后发送 SIGURG. |
另外一个的 poll/select 方法是让内核用 SIGIO 信号来通知应用程序. 要这么用的话你必须用 fcntl(2) 设置套接字文件描述符的 FASYNC 标志,并用 sigaction(2). 给 SIGIO 信号设置一个的有效信号处理句柄.参看下面的 SIGNALS 的讨论. 套接字选项
套接字选项可以用 setsockopt(2) 来设置,用 getsockopt(2) 读取所有套接字级别设为 SOL_SOCKET 的套接字的套接字选项:
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_t 的 si_fd 区域中的文件描述符. 更多信息参见 fcntl(2)
在某些环境中(例如:多个进程访问单个套接字), 引发 SIGIO 的东西在进程对信号作出反应时可能已经消失了. 如果这样的话, 进程应该再次等待, 因为 Linux 稍后会重发此信号. SYSCTLS
可以通过目录 /proc/sys/net/core/* 下的文件或者用 sysctl(2) 系统调用来访问内核套接字的网络系统控制(sysctl)信息. 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_FILTER 和 SO_DETACH_FILTER 套接字选项. 在 libpcap 库有此接口的说明VERSIONS 版本
SO_BINDTODEVICE 在 Linux 2.0.30 中引入. SO_PASSCRED 是在 Linux 2.2 中引入的新选项. sysctl 是在 Linux 2.2. 中引入的新概念。作者
本手册页由 Andi Kleen 编写.- linux socket
- socket linux
- linux + socket
- linux socket
- linux socket
- Linux socket
- linux socket
- linux socket
- Linux Socket
- Linux socket
- linux socket
- linux socket
- linux socket
- Linux Socket
- linux socket
- Linux socket
- linux socket
- 【Linux】socket
- C#实现Base64编码与解码(二)
- Windows消息
- 多ISP网关研究现状
- TD学习总结(一)
- SGA_MAX_SIZE与SGA_TARGET
- socket linux
- Eclipse 出错:Could not find the main class. Program will exit
- 从浏览器之争的博弈关系看程序员的技术走向
- 知耻而后勇
- TD学习总结(二)
- 做个标记
- 创建自己的GDM登陆画面
- 【c# webform】页面参数传递
- 求一数的N次方的最后几位数(待续)