
Linux高性能服务器编程
文章平均质量分 54
阳光开朗男孩
躺平才是王道
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
5.11socket选项
socket选项如果说fcntl系统调用是控制文件描述符属性的通用POSIX方法,那么下面两个系统调用则是专门用来读取和设置socket文件描述符属性的方法:#include <sys/socket.h>int getsockopt(int sockfd, int level, int option_name, void * option_value, socklen_t * restrict option_len);int setsockopt(int sockfd, int leve原创 2021-11-29 18:59:11 · 1757 阅读 · 0 评论 -
5.10地址信息函数
地址信息函数在某些情况下,我们想知道一个连接socket的本端socket地址,以及远端的socket地址。下面这两个函数正是用于解决这个问题:#include <sys/socket.h>int getsockname(int sockfd, struct sockaddr * address, socklen_t * address_len);int getpeername(int sockfd, struct sockaddr * address, socklen_t * add原创 2021-11-24 19:22:45 · 1570 阅读 · 0 评论 -
5.9带外标记
带外标记代码清单5-7演示了TCP带外数据的接收方法。但在实际应用中,我们通常无法预期带外数据何时到来。好在Linux内核检测到TCP紧急标志时,将通知应用程序有带外数据需要接收。内核通知应用程序带外数据到达的两种常见方式是:I/O复用产生的异常事件和SIGURG信号。但是,即使应用程序得到了有带外数据需要接收的通知,还需要知道带外数据在数据流中的具体位置,才能准确接收带外数据。这一点可通过如下系统调用实现:#include <sys/socket.h>int sockatmark(in原创 2021-11-24 19:06:58 · 849 阅读 · 0 评论 -
5.8数据读写
TCP数据读写对文件的读写操作read和write同样适用于socket。但是socket编程接口提供了几个专门用于socket数据读写的系统调用,它们增加了对数据读写的控制。其中用于TCP流数据读写的系统调用是:#include <sys/types.h>#include <sys/socket.h>ssize_t recv(int sockfd, void *buf, size_t len, int flags);ssize_t send(int sockfd, con原创 2021-11-24 19:02:13 · 1042 阅读 · 0 评论 -
5.7关闭连接
关闭连接关闭一个连接实际上就是关闭该连接对应的socket,这可以通过如下关闭普通文件描述符的系统调用来完成:#include <unistd.h>int close(int fd);fd参数是待关闭的socket。不过,close 系统调用并非总是立即关闭一个连接,而是将fd的引用计数减1。只有当fd的引用计数为0时,才真正关闭连接。多进程程序中,一次fork系统调用默认将使父进程中打开的socket引用计数加1,因此我们必须在父进程和子进程中都对该socket执行close调用才能原创 2021-11-22 15:02:08 · 658 阅读 · 0 评论 -
5.6发起连接
发起连接如果说服务器通过listen调用来被动接受连接,那么客户端需要通过如下系统调用来主动与服务器建立连接:#include <sys/types.h>#include <sys/socket.h>int connect(int sockfd, const struct sockaddr * serv_addr, socklen_t addrlen);sockfd参数由socket系统调用返回一个socket。serv_addr 参数是服务器监听的socket地址,ad原创 2021-11-22 14:53:31 · 743 阅读 · 0 评论 -
5.5接受连接
接受连接下面的系统调用从listen 监听队列中接受一个连接:#include <sys/types.h>#include <sys/socket.h>int accept( int sockfd, struct sockaddr * addr, socklen_t * addrlen );sockfd参数是执行过listen系统调用的监听socket。addr 参数用来获取被接受连接的远端socket地址,该socket地址的长度由addrlen参数指出。accept成原创 2021-11-22 14:48:04 · 1022 阅读 · 0 评论 -
5.4监听socket
监听socketsocket被命名之后,还不能马上接受客户连接,我们需要使用如下系统调用来创建一个监听队列以存放待处理的客户连接:#include <sys/socket.h>int listen(int sockfd, int backlog);sockfd参数指定被监听的socket。backlog参数提示内核监听队列的最大长度。监听队列的长度如果超过backlog,服务器将不受理新的客户连接,客户端也将收到ECONNREFUSED错误信息。在内核版本2.2之前的Linux中,ba原创 2021-11-19 19:22:24 · 2655 阅读 · 0 评论 -
5.3命名socket
命名socket创建socket时,我们给它指定了地址族,但是并未指定使用该地址族中的哪个具体socket地址。将一个 socket与socket地址绑定称为给socket命名。在服务器程序中,我们通常要命名socket,因为只有命名后客户端才能知道该如何连接它。客户端则通常不需要命名socket,而是采用匿名方式,即使用操作系统自动分配的socket地址。命名socket的系统调用是bind,其定义如下:#include <sys/types.h>#include <sys/soc原创 2021-11-19 14:00:03 · 996 阅读 · 0 评论 -
5.2创建socket
创建socketUNIX/Linux的一个哲学是:所有东西都是文件。socket也不例外,它就是可读、可写、可控制、可关闭的文件描述符。下面的socket系统调用可创建一个socket:#include <sys/types.h>#include <sys/socket.h>int socket(int domain, int type, int protocol);domain参数告诉系统使用哪个底层协议族。对TCP/IP协议族而言,该参数应该设置为PF_ INET (原创 2021-11-19 13:49:43 · 1642 阅读 · 0 评论 -
socket地址API
主机字节序和网络字节序现代CPU的累加器一次都能装载 (至少) 4字节(这里考虑32位机,下同),即-一个整数。那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数的值。这就是字节序问题。字节序分为大端字节序(big endian)和小端字节序(itle endian)。大端字节序是指一个整数的高位字节(23 ~ 31 bit)存储在内存的低地址处,低位字节(0~ 7bit)存储在内存的高地址处。小端字节序则是指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的低地址处。//查看机器字原创 2021-11-09 16:24:42 · 986 阅读 · 0 评论