Linux下的网络编程总结.pdf
《Linux下的网络编程总结.pdf》由会员分享,可在线阅读,更多相关《Linux下的网络编程总结.pdf(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux 网络编程 参考于linux 环境下 C 编程指南 2012-5-5 说明:这篇文章是我通过学习 linux 网络编程时,按照 TCP、UDP 的工作过程进行的总结。当你阅读别人写的源代码时,可能会遇到某些细节不是很了解。我通过网络查找资料,尽可能的把所有的细节都写入其中。其中详细介绍了工作过程中使用到的函数,并对函数的作用作了注释。希望对大家有所帮助。1 1、TCPTCP 套接口编程套接口编程 基于 TCP 的客户机/服务器模式 使用 TCP 协议的客户机/服务器进程的工作过程如下:客户机进程 服务器进程 socket()socket()bind()listen()accept()
2、挂起,直到有客户的连接请求 connect()三段握手过程 send()recv()服务请求 处理服务请求 0 recv()send()应答信号 close()recv()结束连接通知 基于 TCP 协议的客户机/服务器进程图 服务器进程:1、socket():sockfd=socket(AF_INET,SOCK_STREAM,0)函数原型:#include int socket(int family,int type,int protocol);返回值为非负描述字,则表示成功;如果为负值,则表示失败。其中,参数 family指明协议族;参数 type 指明字节流类型;而参数 protocol
3、 一般为 0。功能:生成一个套接口描述字,也称为套接字。参数 family 的取值范围是:AF_LOCAL UNIX 协议族 AF_ROUTE 路由套接口 AF_INET IPv4 协议 AF_INET6 IPv6 协议 AF_KEY 密钥套接口 参数 type 的取值范围:SOCK_STREAM TCP 套接口 SOCK_DGRAM UDP 套接口 SOCK_PACKET 支持数据链路访问 SOCK_RAM 原始套接口 生成套接口描述字(套接字)后,要为套接口的地址数据结构进行赋初值(1)通用套接口地址数据结构 struct sockaddr unit8_t sa_len;sa_family
4、_t sa_family;/*协议族名*/char sa_data14;它包含在头文件中(2)IPv4 套接口地址数据结构 include struct in_addr in_addr_t s_addr;/*32 位 IP 地址,网络字节序*/;struct sockaddr_in uint8 sin_len;sa_family_t sin_family;in_port_t sin_port;/*16 位端口号,网络字节序*/struct in_addr sin_addr;char sin_zero8;/*备用的域,未使用*/;sockaddr_in 结构中成员均以 sin_开头;sin_le
5、n 数据长度成员,固定长度为 16 字节,一般不用设置它;sin_family 协议族名 IPv4 为 AF_INET;sin_port TCP 或 UDP 协议的端口号;端口号与 IPv4 地址都是以网络字节序存储的。例:(my_addr 的类型为 struct sockaddr_in)bzero(&my_addr,sizeof(my_addr);/清零 my_addr.sin_family=AF_INET;my_addr.sin_port=htons(MYPORT);/#define MYPORT 3490 my_addr.sin_addr.s_addr=htonl(INADDR_ANY)
6、;注释:1 bzero()函数原型:#include void bzero(void*dest,size_t nbytes);功能:将指定的起始地址 dest 的前 nbytes 个字节长设置为 0 2 在网络协议中处理多字节数据时采用的都是网络字节序,而不是主机字节序。要把主机字节序和网络字节序相对应,就要用到提供主机字节序和网络字节序之间相互转换功能的函数。#include uint16_t htonsuint16_t hostvalue;uint32_t htonluint32_t hostvalue;返回的是网络字节序。#include uint16_t ntohsuint16_t n
7、etvalue;uint32_t ntohluint32_t netvalue;返回的是主机字节序。以上函数中,h 代表 host,n 代表 network,s 代表 short,l 代表 long。一般情况下,使用 htons 和 ntohs 转换端口号,使用 htonl 和 ntohl 转换 IP 地址。3 在大多数系统中,INADDR_ANY 等于 0。值为 0 的数用大端字节数和小端字节数格式表示都一样,因此不必进行网络字节序和本机字节序的转换,可以直接写成如下形式。serveraddr.sin_addrINADDR_ANY;但是,也许会有少数机器定义 INADDR_ANY 为其他值,
8、这时就必须进行字节序的转换。为了保证程序的通用性和机器的无关性,最好每次都进行转换,以保证程序能在所有机器上使用。2、bind()ret=bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr);函数原型:#include int bind(int sockfd,const struct sockaddr*myaddr,socklen_t addrlen);返回值为 0 表示成功,如果失败则返回-1,并且设置全局变量 errno。参数 sockfd:套接字 参数 my_addr:指向 sockaddr 结构体的指针(该结构体中
9、保存有端口和 IP 地址信息)。参数 addlen:结构体 sockaddr 的长度。功能:当调用 socket 函数创建套接字后,该套接字并没有与本机地址和端口等信息相连,bind 函数将完成这些工作。错误信息:EACCES:地址受到保护,用户非超级用户。EADDRINUSE:指定的地址已经在使用。EBADF:sockfd 参数为非法的文件描述符。EINVAL:socket 已经和地址绑定。ENOTSOCK:参数 sockfd 为文件描述符。3、listen()ret=listen(sockfd,BACKLOG);/#define BACKLOG 10 函数原型:#include#inclu
10、de int listen(int sockfd,int backlog);功能:listen 函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在 TCP 服务器编程中 listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。listen 函数在一般在调用 bind 之后-调用 accept 之前调用。返回:0成功,-1失败 参数 sockfd:被 listen 函数作用的套接字,sockfd 之前由 socket 函数返回。在被 socket 函数返回的套接字 fd 之时,它是一个主动连接的套接字,也就是此时系统假设用户会对这
11、个套接字调用 connect 函数,期待它主动与其它进程连接,然后在服务器编程中,用户希望这个套接字可以接受外来的连接请求,也就是被动等待用户来连接。由于系统默认时认为一个套接字是主动连接的,所以需要通过某种方式来告诉系统,用户进程通过系统调用 listen 来完成这件事。参数 backlog:规定内核为此套接口排队的最大选择个数。这个参数涉及到一些网络的细节。在进程正理一个一个连接请求的时候,可能还存在其它的连接请求。因为 TCP 连接是一个过程,所以可能存在一种半连接的状态,有时由于同时尝试连接的用户过多,使得服务器进程无法快速地完成连接请求。如果这个情况出现了,服务器进程希望内核如何处理
12、呢?内核会在自己的进程空间里维护一个队列以跟踪这些完成的连接但服务器进程还没有接手处理或正在进行的连接,这样的一个队列内核不可能让其任意大,所以必须有一个大小的上限。这个 backlog 告诉内核使用这个数值作为上限。毫无疑问,服务器进程不能随便指定一个数值,内核有一个许可的范围。这个范围是实现相关的。很难有某种统一,一般这个值会小 30 以内。4、accept()sin_size=sizeof(struct sockaddr_in);con_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size);函数原型:#include#incl
13、ude int accept(int sockfd,struct sockaddr*cliaddr,socklen_t*addrlen);功能:accept 函数用于面向连接类型的套接字类型(SOCK_STREAM 和SOCK_SEQPACKET)。accept 函数将从连接请求队列中获得连接信息,创建新的套接字,并返回该套接字的文件描述符。新创建的套接字用于服务器与客户机的通信,而原来的套接字仍然处于监听状态。它们的区别在于:监听套接口描述字只有一个,而且一直存在,每一个连接都有一个已连接套接口描述字,当连接断开时就关闭该描述字。返回值:成功,返回值非负,返回新的套接字文件描述符 出错将返回
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 网络 编程 总结
限制150内