2022年Linux+C网络编程 .pdf
《2022年Linux+C网络编程 .pdf》由会员分享,可在线阅读,更多相关《2022年Linux+C网络编程 .pdf(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux C编程-网络编程摘要网络编程,一定离不开套接口;那什么是套接口呢?在Linux 下,所有的I/O 操作都是通过读写文件描述符而产生的,文件描述符是一个和打开的文件相关联的整数,这个文件并不只包括真正存储在磁盘上的文件,还包括一个网络连接、一个命名管道、一个终端等,而套接口就是系统进程和文件描述符通信的一种方法。目前最常用的套接口是字:字节流套接口(基于 TCP)和数据报套接口(基于 UDP),当然还有原始套接口(原始套接口提供TCP 套接口和UDP 套接口所不提供的功能,如构造自己的TCP 或 UDP 分组)等,我们这里主要介绍字节流套接口和数据报套接口。By Wing网络编程,一
2、定离不开套接口;那什么是套接口呢?在Linux 下,所有的I/O 操作都是通过读写文件描述符而产生的,文件描述符是一个和打开的文件相关联的整数,这个文件并不只包括真正存储在磁盘上的文件,还包括一个网络连接、一个命名管道、一个终端等,而套接口就是系统进程和文件描述符通信的一种方法。目前最常用的套接口是字:字节流套接口(基于 TCP)和数据报套接口(基于 UDP),当然还有原始套接口(原始套接口提供TCP 套接口和UDP 套接口所不提供的功能,如构造自己的TCP 或 UDP 分组)等,我们这里主要介绍字节流套接口和数据报套接口。要学习网络编程,一定离不开网络库的函数,在 Linux 系统下,可以用
3、 man 函数名 来得到这个函数的帮助,不过为了照顾E 文不大好的朋友,下面就将常用的网络函数和用法列出来供大家参考:、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。-#include int socket(int family,int type,int protocol);返回:非负描述字成功-1失败-名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 9 页 -第一个参数指明了协议簇,目前支持 5种协议簇,最常用的有AF_INET(IPv4 协议)和 AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类
4、型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和 SOCK_RAW(原始套接口);如果套接口类型不是原始套接口,那么第三个参数就为0。、connect函数:当用socket建立了套接口后,可以调用connect为这个套接字指明远程端的地址;如果是字节流套接口,connect就使用三次握手建立一个连接;如果是数据报套接口,connect仅指明远程端地址,而不向它发送任何数据。-#include int connect(int sockfd,const struct sockaddr*servaddr,socklen_t addrlen);返回:0成功-1失败
5、-第一个参数是socket 函数返回的套接口描述字;第二和第三个参数分别是一个指向套接口地址结构的指针和该结构的大小。这些地址结构的名字均已“sockaddr_”开头,并以对应每个协议族的唯一后缀结束。以IPv4套接口地址结构为例,它以“sockaddr_in”命名,定义在头文件;以下是结构体的内容:-struct in_addr in_addr_t s_addr;/*IPv4 地址*/;struct sockaddr_in uint8_t sin_len;/*无符号的 8位整数*/sa_family_t sin_family;/*套接口地址结构的地址簇,这里为AF_INET*/in_port
6、_t sin_port;/*TCP或 UDP 端口*/struct in_addr sin_addr;char sin_zero8;-、bind 函数:为套接口分配一个本地IP 和协议端口,对于网际协议,协议地址是32位 IPv4 地址或 128位 IPv6 地址与 16位的 TCP 或 UDP 端口号的组合;如指定端口为0,调用 bind 时内核将选择一个临时端口,名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 9 页 -如果指定一个通配IP 地址,则要等到建立连接后内核才选择一个本地IP 地址。-#include int bind(int sockfd,const struc
7、t sockaddr*myaddr,socklen_t addrlen);返回:0成功-1失败-第一个参数是socket 函数返回的套接口描述字;第二和第第三个参数分别是一个指向特定于协议的地址结构的指针和该地址结构的长度。、listen函数:listen函数仅被TCP 服务器调用,它的作用是将用sock创建的主动套接口转换成被动套接口,并等待来自客户端的连接请求。-#include int listen(int sockfd,int backlog);返回:0成功-1失败-第一个参数是socket 函数返回的套接口描述字;第二个参数规定了内核为此套接口排队的最大连接个数。由于 listen
8、函数第二个参数的原因,内核要维护两个队列:以完成连接队列和未完成连接队列。未完成队列中存放的是TCP 连接的三路握手为完成的连接,accept 函数是从以连接队列中取连接返回给进程;当以连接队列为空时,进程将进入睡眠状态。、accept函数:accept函数由 TCP 服务器调用,从已完成连接队列头返回一个已完成连接,如果完成连接队列为空,则进程进入睡眠状态。-#include int accept(int sockfd,struct sockaddr*cliaddr,socklen_t*addrlen);回:非负描述字成功-1失败-名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共
9、 9 页 -第一个参数是socket 函数返回的套接口描述字;第二个和第三个参数分别是一个指向连接方的套接口地址结构和该地址结构的长度;该函数返回的是一个全新的套接口描述字;如果对客户段的信息不感兴趣,可以将第二和第三个参数置为空。、inet_pton函数:将点分十进制串转换成网络字节序二进制值,此函数对IPv4 地址和 IPv6 地址都能处理。-#include int inet_pton(int family,const char*strptr,void*addrptr);返回:1成功0输入不是有效的表达格式-1失败-第一个参数可以是AF_INET或 AF_INET6:第二个参数是一个指向
10、点分十进制串的指针:第三个参数是一个指向转换后的网络字节序的二进制值的指针。、inet_ntop函数:和inet_pton函数正好相反,inet_ntop函数是将网络字节序二进制值转换成点分十进制串。-#include const char*inet_ntop(int family,const void*addrptr,char*strptr,size_t len);返回:指向结果的指针成功NULL 失败-第一个参数可以是AF_INET或 AF_INET6:第二个参数是一个指向网络字节序的二进制值的指针;第三个参数是一个指向转换后的点分十进制串的指针;第四个参数是目标的大小,以免函数溢出其调用
11、者的缓冲区。、fock 函数:在网络服务器中,一个服务端口可以允许一定数量的客户端同时连接,这时单进程是不可能实现的,而fock 就分配一个子进程和客户端会话,当然,这只是fock 的一个典型应用。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 9 页 -#include pid_t fock(void);返回:在子进程中为0,在父进程中为子进程ID-1失败-fock 函数调用后返回两次,父进程返回子进程ID,子进程返回 0。有了上面的基础知识,我们就可以进一步了解TCP 套接口和UDP 套接口、TCP 套接口TCP 套接口使用TCP 建立连接,建立一个TCP 连接需要三次握手,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年Linux+C网络编程 2022 Linux 网络 编程
限制150内