Linux network programming
文章平均质量分 56
lesliefish
不要停歇、不回头
展开
-
Linux网络编程 -- 网络模型与通信过程
OSI七层模型物理层 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。 它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。 这一层的数据叫做比特。数据链路层 定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。 这一层通常还提供错误检测和纠正,以确保数据的可靠原创 2016-02-11 22:19:12 · 1001 阅读 · 0 评论 -
多线程并发C/S基本通信模型及实现
本例实现如下功能: 服务端接收来自客户端发送过来的字符串,将小写转换为大写后发送回客户端。 其中,每一个新客户端连接后,服务端主进程为此客户端创建一个线程进行数据的处理。多线程并发服务端:/*server.c*/#include <stdio.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#inclu原创 2016-02-20 15:18:08 · 2276 阅读 · 0 评论 -
select系统调用 -- 文件描述符就绪条件
select系统调用原型如下:#include <sys/select.h>int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);参数readfds, writefds, exceptfds参数分别指向可读、可写和异常事件对应的文件描述符集合。哪些情况下原创 2016-04-04 22:21:12 · 3036 阅读 · 0 评论 -
select同时处理普通数据及带外数据
select系统调用,同时处理普通数据及带外数据程序源码:#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#incldue <assert.h>#include <stdio.h>#include <unistd.h>#include <errno.h>原创 2016-04-04 23:24:04 · 646 阅读 · 0 评论 -
SIGURG信号 -- 带外数据的处理
使用SIGURG处理带外数据程序实例:#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <assert.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <errno.h>#include <str原创 2016-04-06 00:18:11 · 3003 阅读 · 0 评论 -
TCP连接终止前的TIME_WAIT状态
TIME_WAIT状态客户端连接在接收到服务器结束报文段之后,并未直接进入CLOSED状态,而是转移到TIME_WAIT状态。 在这个状态,客户端连接要等待一段长为2 MSL(Maximum Segment Life,报文段最大生存时间)的时间,才能完全关闭。 MSL是TCP报文段在网络中最大生存时间,标准文档RFC 1122的建议值是2min(即2分钟)。为何会有TIME_WAIT?TIME_原创 2016-03-25 18:48:21 · 1776 阅读 · 0 评论 -
IP地址转换函数
人们习惯用可读性好的字符串来表示IP地址,比如用点分十进制字符串表示IPv4地址,十六进制表示IPv6地址。 下面3个函数用于点分十进制字符串表示的IPv4地址及用网络字节序整数表示的IPv4地址之间的转换:#include <arpa/inet.h>in_addr_t inet_addr(const char* strptr);int inet_aton(const char* cp, str原创 2016-03-28 15:34:43 · 1962 阅读 · 0 评论 -
监听socket(bind()的backlog参数)
监听socket的创建:#include <sys/socket.h>int listen(int sockfd, int backlog);sockfd参数指定被监听的socket。backlog参数提示内核监听队列的最大长度(backlog + 1)。 listen成功返回0, 失败返回-1,设置errrno。研究backlog参数对listen系统调用实际影响:/*************原创 2016-03-28 17:43:15 · 2104 阅读 · 0 评论 -
socket关闭连接 -- shutdown系统调用
shutdown函数原型:#include <sys/socket.h>int shutdown(int sockfd, int howto);sockfd参数是待关闭的socket。 howto参数决定了shutdown的行为,具体取如下的值:SHUT_RD: 关闭sockfd上读的这一半。应用程序不能再针对socket文件描述符执行读操作,并且该socket接收缓冲区中的数据都被丢弃。SHUT原创 2016-03-28 23:29:47 · 1817 阅读 · 1 评论 -
判断机器字节序 -- 大端小端判断代码
#include <stdio.h>void byteorder(){ union { short value; char union_bytes[sizeof(short)]; }test; test.value = 0x0102; if((test.union_bytes[0] == 1) && (test.union_b原创 2016-03-28 12:20:11 · 841 阅读 · 0 评论 -
多进程并发C/S通信基本模型及实现
本例实现如下功能: 服务端接收来自不能客户端发送过来的字符串,将小写转换为大写后发送回客户端。 其中,每一个新客户端连接后,服务端主进程为此客户端创建一个子进程进行数据的处理。多进程并发服务端代码:/*server.c*/#include <stdio.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#原创 2016-02-19 21:20:41 · 1968 阅读 · 0 评论 -
Linux网络编程 -- socketpair的使用
socketpair的使用Linux实现了一个源自BSD的socketpair调用,可以实现在同一个文件描述符中进行读写的功能。 该系统调用能创建一对已连接的UNIX族socket。 在Linux中,完全可以把这一对socket当成pipe返回的文件描述符一样使用,唯一的区别就是这一对文件描述符中的任何一个都可读和可写,函数原型如下:#include <sys/types.h>#include原创 2016-02-18 10:49:52 · 12946 阅读 · 1 评论 -
socket编程 -- epoll模型服务端/客户端通信的实现
本例实现如下功能: 支持多客户端与一个服务端进行通信,客户端给服务端发送字符串数据,服务端将字符串中小写转为大写后发送回客户端,客户端打印输出经转换后的字符串。 例如:发送abcde,打印输出ABCDE 服务端源码如下:/*server.c*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <netine原创 2016-02-17 14:43:45 · 5664 阅读 · 0 评论 -
协议格式
数据包封装传输层及其以下的机制由内核提供,应用层由用户进程提供,应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报原创 2016-02-12 00:08:33 · 2074 阅读 · 0 评论 -
TCP状态转换
TCP建立连接协议与终止连接协议过程建立连接协议(三次握手)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。客户必须再次回应服务段一个ACK报文,这是报文段3。连接终止协议(四次原创 2016-02-12 10:44:06 · 362 阅读 · 0 评论 -
TCP流量控制
如果发送端发送的速度较快,接收端接收到数据后处理的速度较慢,而接收缓冲区的大小是固定的,就会丢失数据。TCP协议通过“滑动窗口(Sliding Window)”机制解决这一问题。滑动窗口 发送端发起连接,声明最大段尺寸是1460,初始序号是0,窗口大小是4K,表示“我的接收缓冲区还有4K字节空闲,你发的数据不要超过4K”。接收端应答连接请求,声明最大段尺寸是1024,初始序号是8000,窗口大小是6原创 2016-02-12 11:01:22 · 533 阅读 · 0 评论 -
socket编程 -- 网络字节序、IP地址转换、sockaddr数据结构
网络字节序内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的 多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢?发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据原创 2016-02-12 15:42:16 · 3687 阅读 · 0 评论 -
socket编程 -- socket、bind、accept、connect函数
socketsocket函数原型#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int socket(int domain, int type, int protocol);参数说明domain: AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地址 AF_INET6 与上面原创 2016-02-12 19:40:51 · 16648 阅读 · 0 评论 -
socket编程 -- 基于TCP协议的C/S通信模型及实现
基于TCP协议的客户端/服务器的程序下图是基于TCP协议的客户端/服务器程序的一般流程服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到原创 2016-02-12 23:47:28 · 7662 阅读 · 0 评论 -
socket编程 -- 基于UDP协议的C/S通信模型及实现
UDP服务端/客户端通信的基本模型由于UDP不需要维护连接,程序逻辑简单了很多。 但是UDP协议是不可靠的,实际上有很 多保证通讯可靠性的机制需要在应用层实现。基于UDP协议的客户端/服务端通信的实现服务端 接收来自客户端的字符串,将小写字母转为大写字符后发送给客户端服务端源码server.c/*server.c*/#include <stdio.h>#include <stdlib.h>原创 2016-02-13 20:56:51 · 4050 阅读 · 0 评论 -
socket编程 -- 大端小端区别及转换
计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。内存的低地址存储数据的低字节,高地址存储数据的高字节的方式叫小端模式。内存的高地址存储数据的低字节,低地址存储数据高字节的方式称为大端模式。例子:对于内存中存放的数0x12345678来说 如果是采用大端模式存放的,则其真实的数是:0x12345678 如果是采用小端模式存放的,则其真实的数是:0x78原创 2016-02-13 23:40:53 · 5871 阅读 · 0 评论 -
网络地址格式及域名地址转化
网络地址格式转化通常用户在表达地址时采用的是点分十进制表示的数值(或者是为冒号分开的十进制Ipv6地址),而在通常使用的socket编程中使用的则是32位的网络字节序的二进制值,这就需要将这两个数值进行转换。这里在Ipv4中用到的函数有inet_aton()、inet_addr()和inet_ntoa(),而IPV4和Ipv6兼容的函数有inet_pton()和inet_ntop()。 I原创 2016-02-14 15:40:27 · 4484 阅读 · 0 评论 -
Linux I/O复用之select函数详解
select函数的功能和调用顺序使用select函数时统一监视多个文件描述符的: 1、 是否存在套接字接收数据? 2、 无需阻塞传输数据的套接字有哪些? 3、 哪些套接字发生了异常?select函数调用过程: 由上图知,调用select函数需要一些准备工作,调用后还需要查看结果。设置文件描述符select可以同时监视多个文件描述符(套接字)。 此时需要先将文件描述符集中到一起。集原创 2017-02-12 20:50:08 · 15054 阅读 · 4 评论