[a] socket / socketpair

#include <sys/socket.h>
int socket(int domain, int type, int protocol)
int socketpair(int domain, int type, int protocol, int sv[2])
//成功返回套接字描述符,出错返回 -1 
  • 套接字描述符本质上是就是文件描述符
  • socket 类型由三个参数共同确定
    • domain:AF_UNIX / AF_LOCAL / AF_INET / AF_INET6,其中 AF_LOCAL 是 AF_UNIX 的别名
    • type:SOCK_STREAM / SOCK_DGRAM / SOCK_SEQPACKET / SOCK_RAW
    • protocol:IPPROTO_TCP / IPPROTO_UDP / IPPROTO_ICMP / IPPROTO_IP / IPPROTO_IP6,通常设为 0,表示采用与 type 对应的默认值
  • 可以操纵套接字的通用函数:close /read / write / dup / dup2 / fcntl / epoll / kqueue ...
  • socketpair 仅用于创建匿名 UNIX 域套接字,功能相当于全双工管道

[b] shutdown

#include <sys/socket.h>
int shutdown(int sockfd, int how) //成功返回 0,出错返回 -1 
  • 用于关闭双向传输中的一个或全部两个方向
  • 与 close 的区别是,shutdown 允许使一个套接字处于不活动状态,和引用它的描述符数量无关
  • how 参数可用值:SHUT_RD / SHUT_WR / SHUT_RDWR

[c] htonl / htons / ntohl / ntohs

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostint32)
uint16_t htons(uint16_t hostint16)
//返回以网络字节序表示的整数
uint32_t ntohl(uint32_t netint32)
uint16_t ntohs(uint16_t netint16)
//返回以主机字节序表示的整数 
  • TCP/IP 协议栈使用大端字节序(big-endian,右侧代表高位),Intel 处理器通常采用小端字节序(little-endian,左侧代表高位)

[d] getaddrinfo / freeaddrinfo / gai_strerror / getnameinfo

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int getaddrinfo(const char *hostname, const char *servname, const struct addrinfo *hints, struct addrinfo **res) //成功返回 0,出错返回非 0
void freeaddrinfo(struct addrinfo *ai)
const char *gai_strerror(int errno) //返回描述错误码的字符串指针
int getnameinfo(const struct sockaddr *saddr, socklen_t salen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags) //成功返回 0,出错返回非 0 
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_profocol;
socklen_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname; //canonical name,not alias name!
struct addrinfo *ai_next; //next in list
  • getaddrinfo 函数通过主机名或服务名或两者一起查询对应的网络地址信息,存储在 addrinfo 链表结构中,若查询出错,不能使用 perror 或 strerror 生成错误信息,需要使用 gai_strerror

    • *hints 参数用于设定过滤条件,可以设定字段: ai_flags / ai_family / ai_socktype / ai_protocol ,其余字段必须指定为 0 或 NULL
    • **res 参数用于存储查询结果
    • struct addrinfo 结构体
      • ai_flags(按位 '|' 组合,作用于 *hints 参数)

        • AI_CANONNAME:提供的查询依据是正规主机名称,不是别名
        • AI_NUMERICHOST:提供的主机名不是字符串,是点分样式的 IP 地址
        • AI_NUMERICSERV:提供的服务名不是字符串,是端口号
        • ...
      • ai_family:AF_UNIX / AF_INET / AF_INET6 ...
      • ai_socktype:SOCK_STREAM / SOCK_DGRAM / SOCK_SEQPACKET ...
      • ai_protocol:IPPROTO_TCP / IPPROTO_UDP / IPPROTO_ICMP ...
      • ai_addrlen:地址长度
      • *ai_addr:指向 struct sockaddr 通用地址结构体的指针
      • *ai_canonname:正规主机名,非别名
      • *ai_next:指向下一个 addrinfo 结构体(如果有)
    • freeaddrinfo 函数用于释放 addrinfo 链表结构
  • getnameinfo 函数将二进制网络地址信息转换成主机名或服务名,flags 可用标志如下:
    • NI_DGRAM:指定此标志将返回 datagram 对应的服务端口号,默认将返回 stream 对应的端口号,如某个服务 TCP / UDP 端口号不相同的情况
    • NI_NUMERICHOST:返回主机 IP 点分形式
    • NI_NUMERICSCOPE:针地 IPv6 返回范围 ID 的数字形式,而非名字
    • NI_NUMERICSERV:返回服务的端口号,而非名称

[e] bind

#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t len); //成功返回 0,出错返回 -1 
/*通用地址结构*/
struct sockaddr {
sa_family_t sa_family;
char sa_data[];
unsigned char sa_len; //FreeBSD only!
}
/*AF_UNIX 地址结构*/
struct sockaddr_un {
sa_family_t sun_family; //AF_UNIX
char sun_path[]; //For Linux: sun_path[108]
unsigned char sun_len; //FreeBSD only! sockaddr len including null
}
/*AF_INET 地址结构*/
struct sockaddr_in {
sa_family_t sun_family;
in_port_t sin_port;
struct in_addr sin_addr; //IPv4 address;
unsigned char sin_zero[]; //Linux only! must fill with 0
}
struct in_addr {
in_addr_t s_addr;
  • 在服务器端,bind 函数用于将 addr 与 sockfd 关联在一起,若 addr 指定为 INADDR_ANY,表示此套接字可以接收当前系统所安装的任何一个网卡的数据包
  • socklen_t 类型字段可使用常量 INET_ADDRSTRLEN / INET6_ADDRSTRLEN 指定恰当的空间大小(长度)存放代表 IPv4 与 IPv6 地址的字符串

[f] getsockname / getpeername

#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *alenp)
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *alenp)
//成功返回 0,出错返回 -1 
  • getsockname 函数用于查询与 sockfd 关联的本机地址,getpeername 用于查询与 sockfd 关联的对端主机地址(前提是已建立连接)

[g] listen

#include <sys/socket.h>
int listen(int sockfd, int backlog) //成功返回 0,出错返回 -1 
  • 调用 listen 函数后,服务器才能被连接
  • 用于创建监听队列,backlog 参数指定了队列长度,表示可同时接受的连接请求最大数量

[h] accept

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *alenp) //成功返回实际与客户端建立连接的新 sockfd,出错返回 -1 
  • 传递给 accept 的原始 sockfd 并没有与客户端连接,而是继续用于接收其它连接请求
  • addr 参数用于存放配对的客户端 sockfd 地址,函数返回时,将把 alenp 的值更新为客户端地址的实际长度

[i] connect

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t len) //成功返回 0,出错返回 -1 
  • 处理面向连接的网络服务(SOCK_STREAM / SOCK_SEQPACKET),在开始交换数据之前,需要首先建立连接
  • 通常客户端调用 connect 发起与服务器的连接,addr 参数指定要连接的服务器地址
  • 若先前创建 sockfd 时未绑定一个本机地址,此时 connect 会自动给 sockfd 绑定一个默认地址
  • 可用于 SOCK_DGRAM,此时传送报文的目标地址会设置成 addr,之后每次传送报文时不再需要提供地址,同时,也仅能接收来 addr 的报文

[j] send / sendto / sendmsg

#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags)
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags)
//成功返回送出的字节数,出错返回 -1 
  • send 成功返回,表示数据已发送到网络上,不代表连接的另一端已收到数据,通常用于面向连接的套接字(除非事先调用 connect 指定了无连接套接字的目标地址),对于支持报文件边界的协议,若尝试发送的单个报文长度超过协议所支持的最大长度,将出错返回
  • 除 flags 参数外,其余参数与 write 相同,flags 可用标志:
    • MSG_DONTWAIT:非阻塞传输,意同 O_NONBLOCK
    • MSG_DONTROUTE:勿将数据包路由出本地网络
    • MSG_NOSIGNAL:在写无连接的套接字时,不产生 SIGPIPE 信号
    • MSG_OOB:发送带外数据(即优先传送数据,不排队,须协议支持)
    • MSG_EOR :如果协议支持,标记记录结结束
  • sendto 与 send 类似,多出的两个参数用于指定目标地址和长度,主要用于无连接套接字
  • sendmsg 行为类似于 writev

[k] recv / recvfrom / recvmsg

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags)
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags) 
  • flags:

    • MSG_DONTWAIT:非阻塞
    • MSG_OOB:若协议支持,获取带外数据
    • MSG_PEEK:返回数据包内容,但不真正取走数据
    • MSG_WAITALL:针对 SOCK_STREAM 等待所有的数据可用时再返回

[l] setsocketopt / getsocketopt

#include <sys/types.h>
#include <sys/socket.h>
int getsockopt(int s, int level, int optname, void * restrict optval, socklen_t * restrict optlen)
int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) 
  • level:

    • SOL_SOCKET:表示将设置通用选项
    • IPPROTO_TCP:TCP 协议特定选项
    • IPPROTO_IP:IP 协议特定选项
    • ...
  • option:
    • SO_DEBUG enables recording of debugging information
    • SO_REUSEADDR enables local address reuse
    • SO_REUSEPORT enables duplicate address and port bindings
    • SO_KEEPALIVE enables keep connections alive
    • SO_DONTROUTE enables routing bypass for outgoing messages
    • SO_LINGER linger on close if data present
    • SO_BROADCAST enables permission to transmit broadcast messages
    • SO_OOBINLINE enables reception of out-of-band data in band
    • SO_SNDBUF set buffer size for output
    • SO_RCVBUF set buffer size for input
    • SO_SNDLOWAT set minimum count for output
    • SO_RCVLOWAT set minimum count for input
    • SO_SNDTIMEO set timeout value for output
    • SO_RCVTIMEO set timeout value for input
    • SO_ACCEPTFILTER set accept filter on listening socket
    • SO_NOSIGPIPE controls generation of SIGPIPE for the socket
    • SO_TIMESTAMP enables reception of a timestamp with datagrams
    • SO_BINTIME enables reception of a timestamp with datagrams
    • SO_ACCEPTCONN get listening status of the socket (get only)
    • SO_TYPE get the type of the socket (get only)
    • SO_PROTOCOL get the protocol number for the socket (get only)
    • SO_PROTOTYPE SunOS alias for the Linux SO_PROTOCOL (get only)
    • SO_ERROR get and clear error on the socket (get only)
    • SO_SETFIB set the associated FIB (routing table) for the socket (set only)

[m] inet_addr / inet_ntoa

#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr in) //转换二进制地址为字符串形式
int inet_aton(const char *cp, struct in_addr *inp) //转换字符串地址为二进制地址(网络字节序),结果写入 inp 指向的结构体 
  • 仅能用于 IPv4,可使用 getaddrinfo 与 getnameinfo 实现

[16]APUE:套接字的更多相关文章

  1. Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级 ...

  2. apue学习笔记(第十六章 网络IPC:套接字)

    本章将考察不同计算机(通过网络连接)上的进程相互通信的机制:网络进程间通信. 套接字描述符 正如使用文件描述符访问文件,应用程序用套接字描述符访问套接字. 许多处理文件描述符函数(如read和writ ...

  3. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. 孙鑫MFC学习笔记16:异步套接字

    16 1.事件对象 2.CreateEvent创建事件对象 3.SetEvent设置事件对象为通知状态 4.ResetEvent设置事件对象为非通知状态 5.InitializeCriticalSec ...

  5. APUE 学习笔记(十一) 网络IPC:套接字

    1. 网络IPC 套接字接口既可以用于计算机之间进程通信,也可以用于计算机内部进程通信   套接字描述符在Unix系统中是用文件描述符实现的   /* 创建一个套接字 */ #include < ...

  6. 第16章 网络IPC:套接字总结

    1 套接字是通信端点的抽象 创建套接字: int socket(int domain,int type,int protocol) domain:通信域 AF_INET.AF_INET6.AF_LOC ...

  7. UNIX环境高级编程 第16章 网络IPC:套接字

    上一章(15章)中介绍了UNIX系统所提供的多种经典进程间通信机制(IPC):管道PIPE.命名管道FIFO.消息队列Message Queue.信号量Semaphore.共享内存Shared Mem ...

  8. 网络IPC:套接字之寻址

    在学习用套接字做一些有意义的事情之前,需要知道如何确定一个目标通信进程. 进程的标识有两个部分:计算机的网络地址可以帮助标识网络上想与之通信的计算机,而服务可以帮助标识计算机上特定的进程. 1.字节序 ...

  9. Linux Socket 原始套接字编程

    对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发 ...

随机推荐

  1. Spark的数据存储

    Spark本身是基于内存计算的架构,数据的存储也主要分为内存和磁盘两个路径.Spark本身则根据存储位置.是否可序列化和副本数目这几个要素将数据存储分为多种存储级别.此外还可选择使用Tachyon来管 ...

  2. 关于搭建一个高性能网站的服务器的架设思路以及nginx测试的并发

    对于高性能网站的架设,主要就是请求量大,那我们该如何进行支撑? 考虑到下面的几个方面: 1.要减少请求,那对于开发人员来说,网站的css文件进行合并,背景图片也要合并,一般都是请求一张比较大的图片,然 ...

  3. 二分查找-python

    约12年年底的时候,接触了python不到半年的样子,入门是直接实现GUI测试case的.今天面试地平线机器人,发现忘得差不多了- -. 当时的问题是这样的 写一个二分查找是实现,我好像不记得二分查找 ...

  4. 设计winform自带动态加载工具按钮和实现热键响应

    1.初衷 主要是想设计一个自带添加工具按钮和按钮的快捷键的基窗体.这样以后所设计的窗体只要继承自这个窗体就可以实现热键响应和动态加工具按钮的功能了 写这边文章主要是为了以后使用的时候有个参考,因为这只 ...

  5. kafka:一个分布式消息系统

    1.背景 最近因为工作需要,调研了追求高吞吐的轻量级消息系统Kafka,打算替换掉线上运行的ActiveMQ,主要是因为明年的预算日流量有十亿,而ActiveMQ的分布式实现的很奇怪,所以希望找一个适 ...

  6. JavaScript DOM编程艺术读书笔记(二)

    第五章 最佳实践 平稳退化(graceful degradation):如果正确使用了JavaScript脚本,可以让访问者在他们的浏览器不支持JavaScript的情况下仍能顺利地浏览你网站.虽然某 ...

  7. IOS系列swift语言之课时三

    今天需要掌握的内容就是:闭包.类.结构体.属性(计算属性和延迟属性) 同样里面有一些题目,有兴趣的可以做一下. 首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量 ...

  8. ajax回调打开新窗体防止浏览器拦截有效方法

    ajax回调打开新窗体防止浏览器拦截,就这么做! 问题剖析:   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function click_fun(){    window ...

  9. 转载:Solr的自动完成实现方式(第三部分:Suggester方式续)

    转自:http://www.cnblogs.com/ibook360/archive/2011/11/30/2269126.html 在之前的两个部分(part1.part2)中,我们学会了如何配置和 ...

  10. IntelliJ设置鼠标悬浮提示和修改快捷键

    IntelliJ设置鼠标悬浮提示和修改快捷键 设置鼠标悬浮提示 修改快捷键 进入设置菜单 删除原来的快捷键(注:你可以选择保留原来的快捷键,同时使用两个快捷键) Good Luck