linux socket编程实例?socket菜鸟教程
大家好,今天小编来为大家解答以下的问题,关于linux socket编程实例,socket菜鸟教程这个很多人还不知道,现在让我们一起来看看吧!
求linux socket网络编程代码
Linux是多任务的操作系统,可在运行在Intel 80386及更高档次的PC机、ARMS、MIPS和PowerPC等多种计算机平台,已成为应用广泛、可靠性高、功能强大的计算机操作系统,Linux具有内核小、效率高、源代码开放等优点,还内含了TCP/IP网络协议,很适合在服务器领域使用,而服务器主要用途之一就是进行网络通信,随着计算机办公自动化处理技术的应用与推广,网络的不断普及,传统的纸张式文件传输方式已经不再适合发展的需要,人们更期待一种便捷、高效、环保、安全的网络传输方式.
协议概述TCP/IP即传输控制协议/网络协议[1](Transmission Control Protocol/Internet Protocol),是一个由多种协议组成的协议族,他定义了计算机通过网络互相通信及协议族各层次之间通信的规范,图1描述了Linux对IP协议族的实现机制[2]。
Linux支持BSD的套接字和全部的TCP/IP协议,是通过网络协议将其视为一组相连的软件层来实现的,BSD套接字(BSD Socket)由通用的套接字管理软件支持,该软件是INET套接字层,用来管理基于IP的TCP与UDP端口到端口的互联问题,从协议分层来看,IP是网络层协议,TCP是一个可靠的端口到端口的传输层协议,他是利用IP层进行传接报文的,同时也是面向连接的,通过建立一条虚拟电路在不同的网路间传输报文,保证所传输报文的无丢失性和无重复性。用户数据报文协议(User Datagram Protocol,UDP)也是利用IP层传输报文,但他是一个非面向连接的传输层协议,利用IP层传输报文时,当目的方网际协议层收到IP报文后,必须识别出该报文所使用的上层协议(即传输层协议),因此,在IP报头上中,设有一个"协议"域(Protocol)。通过该域的值,即可判明其上层协议类型,传输层与网络层在功能说的最大区别是前者提供进程通信能力,而后者则不能,在进程通信的意义上,网络通信的最终地址不仅仅是主机地址,还包括可以描述进程的某种标识符,为此,TCP/UDP提出了协议端口(Protocol Port)的概念,用于标识通信的进程,例如,Web服务器进程通常使用端口80,在/etc/services文件中有这些注册了的端口地址。
对于TCP传输,传输节点间先要建立连接,然后通过该连接传输已排好序的报文,以保证传输的正确性,IP层中的代码用于实现网际协议,这些代码将IP头增加到传输数据中,同时也把收到的IP报文正确的传送到TCP层或UDP层。TCP是一个面向连接协议,而UDP则是一个非面向连接协议,当一个UDP报文发送出去后,Linux并不知道也不去关心他是否成功地到达了目的的主机,IP层之下,是支持所有Linux网络应用的网络设备层,例如点到点协议(Point to Point Protocol,PPP)和以太网层。网络设备并非总代表物理设备,其中有一些(例如回送设备)则是纯粹的软件设备,网络设备与标准的Linux设备不同,他们不是通过Mknod命令创建的,必须是底层软件找到并进行了初始化之后,这些设备才被创建并可用。因此只有当启动了正确设置的以太网设备驱动程序的内核后,才会有/dev/eth0文件,ARP协议位于IP层和支持地址解析的协议层之间。
网络通信原理所有的网络通信就其实现技术可以分为两种,线路交换和包交换,计算机网络一般采用包交换,TCP使用了包交换通信技术,计算机网络中所传输的数据,全部都以包(Packet)这个单位来发送,包由"报头"和"报文"组成,结构如图2所示,在"报头"中记载有发送主机地址,接收主机地址及与报文内容相关的信息等,在"报文"中记载有需要发送的数据,网络中的每个主机和路由器中都有一个路由寻址表,根据这个路由表,包就可以通过网络传送到相应的目的主机。
网络通信中的一个非常重要的概念就是套接字(Socket)[3,4],简单地说,套接字就是网络进程的ID,网络通信归根到底是进程的通信,在网络中,每个节点有一个网络地址(即IP地址),两个进程通信时,首先要确定各自所在网络节点的网络地址,但是,网络地址只能确定进程所在的计算机,而一台计算机上可能同时有多个网络进程,还不能确定到底是其中的哪个进程,由此套接字中还要有其他的信息,那就是端口号(Port),在一台计算机中,一个端口一次只能分配给一个进程,即端口号与进程是一一对应的关系,所以,端口号和网络地址就能唯一地确定Internet中的一个网络进程。可以认为:套接字=网络地址+端口号系统调用一个Socket()得到一个套接字描述符,然后就可以通过他进行网络通信了。
套接字有很多种类,最常用的就有两种;流式套接字和数据报套接字。在Linux中分别称之为"SOCK_STREAM"和"SOCK_DGRAM)"他们分别使用不同的协议,流式套接字使用TCP协议,数据报套接字使用UDP协议,本文所使用的是流式套接字协议。
网络通信原理在文件传输程序设计中的应用网络上的绝大多数通信采用的都是客户机/服务器机制(Client/Server),即服务器提供服务,客户是这些服务的使用者,服务器首先创建一个Socket,然后将该Socket与本地地址/端口号绑定(Bind()),成功之后就在相应的Socket上监听(Listen())。当Accept()函数捕捉到一个连接服务(Connect())请求时,接受并生成一个新的Socket,并通过这个新的Socket与客户端通信,客户端同样也要创建一个Socket,将该Socket与本地地址/端口号绑定,还需要指定服务器端的地址与端口号,随后向服务器端发出Connect(),请求被服务器端接受后,可以通过Socket与服务器端通信。
TCP是一种面向连接的、可靠的、双向的通信数据流,说他可靠,是因为他使用3段握手协议传输数据,并且在传输时采用"重传肯定确认"机制保证数据的正确发送:接收端收到的数据后要发出一个肯定确认,而发送端必须要能接受到这个肯定信号,否则就要将数据重发。在此原理基础之上,设计了基于Linux操作系统下TCP/IP编程实现文件传输的实例。我们采用客户机/服务器模式通信时,通信双方发送/接收数据的工作流程如图3所示。
文件传输就是基于客户机/服务器模型而设计的,客户机和服务器之间利用TCP建立连续,因文件传输是一个交互式会话系统,客户机每次执行文件传输,都需要与服务器建立控制连接和数据连接,其中控制连接负责传输控制信息、利用控制命令、客户机可以向服务器提出无限次的请求,客户机每次提出的请求,服务器与客户机建立一个数据连接,进行实际的数据传输,数据传输完毕后,对应的数据连接被清除,控制连接依然保持,等待客户机发出新的传输请求,直到客户机撤销控制连接,结束会话。
当进行文件传输时,首先向服务器发出连接请求,服务器验证身份后,与客户端建立连接,双方进入会话状态,这时只要客户端向服务器端发出数据连接请求,建立起数据连接后,双方就进入数据传输状态,数据传输完毕后,数据连接被撤销,如此循环反复,直到会话结束,从而实现将文件从服务器端传输至客户机端。
文件传输程序设计流程[5,客户端的TCP应用程序流程(1)先用Socket()创建本地套接口,给服务器端套接口地址结构赋值。
(2)用Connect()函数使本地套接口向服务器端套接口发出建立连接请求,经3次握手建立TCP连接。
(3)用Read()函数读取所要接收的文件名以及存放在内存里的文件内容。
(4)用Open()函数打开客户端新建立的目标文件,如果没有建立,该函数会自动生成目标文件,等待存放文件内容。
(5)最后用Write()函数将读取的文件内容存放在新的目标文件中,以实现服务器端向客户端的文件传输。
(6)通信结束,用Close()关闭套接口,停止接收文件。
服务器端的TCP应用程序流程(1)先用Open()函数打开等待传输的可读文件;(2)用Socket()创建套接口,并给套接口地址结构赋值;(3)用Bind()函数绑定套接口;(4)用Listen()函数在该套接口上监听请求;(5)用Accept()函数接受请求,产生新的套接口及描述字,并与客户端连接;(6)用Lseek()函数是为了在每次接受客户机连接时,将用于读的源文件指针移到文件头;(7)用Read()函数读取一定长度的源文件数据;(8)最后用Write()函数将读取的源文件数据存放在内存中,以便客户端读取;(9)传输完毕时,用Close()关闭所有进程,结束文件传输。
结语Linux操作系统在网络应用方面具有很强的开发潜力,同时Linux也是可靠性、安全性非常高的系统,因此在基于TCP/IP网络通信的研究与开发中,通常选用Linux操作系统作为开发平台
Linux网络编程的目录
第1篇Linux网络开发基础
第1章Linux操作系统概述 2
1.1Linux发展历史 2
1.1.1Linux的诞生和发展 2
1.1.2Linux名称的由来 3
1.2Linux的发展要素 3
1.2.1UNIX操作系统 4
1.2.2Minix操作系统 4
1.2.3POSIX标准 4
1.3Linux与UNIX的异同 5
1.4操作系统类型选择和内核版本的选择 5
1.4.1常见的不同公司发行的Linux异同 6
1.4.2内核版本的选择 6
1.5Linux的系统架构 7
1.5.1Linux内核的主要模块 7
1.5.2Linux的文件结构 9
1.6GNU通用公共许可证 10
1.6.1GPL许可证的历史 10
1.6.2GPL的自由理念 10
1.6.3GPL的基本条款 11
1.6.4关于GPL许可证的争议 12
1.7Linux软件开发的可借鉴之处 12
1.8小结 13
第2章Linux编程环境 14
2.1Linux环境下的编辑器 14
2.1.1vim使用简介 14
2.1.2使用vim建立文件 15
2.1.3使用vim编辑文本 16
2.1.4vim的格式设置 18
2.1.5vim配置文件.vimrc 19
2.1.6使用其他编辑器 19
2.2Linux下的GCC编译器工具集 19
2.2.1GCC简介 19
2.2.2编译程序的基本知识 21
2.2.3单个文件编译成执行文件 22
2.2.4编译生成目标文件 22
2.2.5多文件编译 23
2.2.6预处理 24
2.2.7编译成汇编语言 24
2.2.8生成和使用静态链接库 25
2.2.9生成动态链接库 26
2.2.10动态加载库 29
2.2.11GCC常用选项 31
2.2.12编译环境的搭建 33
2.3Makefile文件简介 34
2.3.1一个多文件的工程例子 34
2.3.2多文件工程的编译 36
2.3.3Makefile的规则 37
2.3.4Makefile中使用变量 39
2.3.5搜索路径 43
2.3.6自动推导规则 44
2.3.7递归make 44
2.3.8Makefile中的函数 46
2.4用GDB调试程序 47
2.4.1编译可调试程序 48
2.4.2使用GDB调试程序 49
2.4.3GDB常用命令 52
2.4.4其他的GDB 59
2.5小结 60
第3章文件系统简介 61
3.1Linux下的文件系统 61
3.1.1Linux下文件的内涵 61
3.1.2文件系统的创建 62
3.1.3挂接文件系统 64
3.1.4索引节点inode 65
3.1.5普通文件 66
3.1.6设备文件 66
3.1.7虚拟文件系统VFS 68
3.2文件的通用操作方法 72
3.2.1文件描述符 72
3.2.2打开创建文件open()、create()函数 72
3.2.3关闭文件close()函数 76
3.2.4读取文件read()函数 77
3.2.5写文件write()函数 79
3.2.6文件偏移lseek()函数 80
3.2.7获得文件状态fstat()函数 83
3.2.8文件空间映射mmap()函数 85
3.2.9文件属性fcntl()函数 88
3.2.10文件输入输出控制ioctl()函数 92
3.3socket文件类型 93
3.4小结 93
第4章程序、进程和线程 94
4.1程序、进程和线程的概念 94
4.1.1程序和进程的差别 94
4.1.2Linux环境下的进程 95
4.1.3进程和线程 96
4.2进程产生的方式 96
4.2.1进程号 96
4.2.2进程复制fork() 97
4.2.3system()方式 98
4.2.4进程执行exec()函数系列 99
4.2.5所有用户态进程的产生进程init 100
4.3进程间通信和同步 101
4.3.1半双工管道 101
4.3.2命名管道 107
4.3.3消息队列 108
4.3.4消息队列的一个例子 114
4.3.5信号量 116
4.3.6共享内存 121
4.3.7信号 124
4.4Linux下的线程 127
4.4.1多线程编程实例 127
4.4.2Linux下线程创建函数pthread_create() 129
4.4.3线程的结束函数pthread_join()和pthread_exit() 129
4.4.4线程的属性 130
4.4.5线程间的互斥 132
4.4.6线程中使用信号量 133
4.5小结 136
第2篇Linux用户层网络编程
第5章TCP/IP协议族简介 138
5.1OSI网络分层介绍 138
5.1.1OSI网络分层结构 138
5.1.2OSI的7层网络结构 139
5.1.3OSI参考模型中的数据传输 140
5.2TCP/IP协议栈 141
5.2.1TCP/IP协议栈参考模型 141
5.2.2主机到网络层协议 143
5.2.3IP协议 144
5.2.4网际控制报文协议(ICMP) 146
5.2.5传输控制协议(TCP) 150
5.2.6用户数据报文协议(UDP) 154
5.2.7地址解析协议(ARP) 156
5.3IP地址分类与TCP/UDP端口 158
5.3.1因特网中IP地址的分类 159
5.3.2子网掩码(subnetmaskaddress) 161
5.3.3IP地址的配置 162
5.3.4端口 163
5.4主机字节序和网络字节序 163
5.4.1字节序的含义 164
5.4.2网络字节序的转换 164
5.5小结 166
第6章应用层网络服务程序简介 167
6.1HTTP协议和服务 167
6.1.1HTTP协议概述 167
6.1.2HTTP协议的基本过程 168
6.2FTP协议和服务 170
6.2.1FTP协议概述 170
6.2.2FTP协议的工作模式 172
6.2.3FTP协议的传输方式 172
6.2.4一个简单的FTP过程 173
6.2.5常用的FTP工具 173
6.3TELNET协议和服务 174
6.3.1远程登录的基本概念 174
6.3.2使用TELNET协议进行远程登录的工作过程 174
6.3.3TELNET协议 174
6.4NFS协议和服务 176
6.4.1安装NFS服务器和客户端 176
6.4.2服务器端的设定 176
6.4.3客户端的操作 177
6.4.4showmount命令 177
6.5自定义网络服务 177
6.5.1xinetd/inetd 178
6.5.2xinetd服务配置 178
6.5.3自定义网络服务 179
6.6小结 180
第7章TCP网络编程基础 181
7.1套接字编程基础知识 181
7.1.1套接字地址结构 181
7.1.2用户层和内核层交互过程 183
7.2TCP网络编程流程 184
7.2.1TCP网络编程架构 184
7.2.2创建网络插口函数socket() 186
7.2.3绑定一个地址端口对bind() 189
7.2.4监听本地端口listen 192
7.2.5接受一个网络请求accept() 194
7.2.6连接目标网络服务器connect() 199
7.2.7写入数据函数write() 200
7.2.8读取数据函数read() 201
7.2.9关闭套接字函数close() 201
7.3服务器/客户端的简单例子 202
7.3.1例子功能描述 202
7.3.2服务器网络程序 203
7.3.3服务器读取和显示字符串 205
7.3.4客户端的网络程序 205
7.3.5客户端读取和显示字符串 206
7.3.6编译运行程序 206
7.4截取信号的例子 207
7.4.1信号处理 207
7.4.2信号SIGPIPE 208
7.4.3信号SIGINT 208
7.5小结 208
嵌入式Linux应用层开发有哪些实例
一:C语言嵌入式Linux工程师的学习需要具备一定的C语言基础,C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识。包括:基本数据类型、数组、指针、结构体、链表、文件操作、队列、栈等。
二:Linux基础 Linux操作系统的概念、安装方法,详细了解Linux下的目录结构、基本命令、编辑器VI,编译器GCC,调试器GDB和 Make项目管理工具, Shell Makefile脚本编写等知识,嵌入式开发环境的搭建。
三:Linux系统编程重点学习标准I/O库,Linux多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、共享内存、signal、信号量等),同步与互斥对共享资源访问控制等重要知识,主要提升对Linux应用开发的理解和代码调试的能力。
四:Linux网络编程计算机网络在嵌入式Linux系统应用开发过程中使用非常广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,全面了解Linux网络应用程序开发。重点学习网络编程相关API,熟练掌握TCP协议服务器的编程方法和并发服务器的实现,了解HTTP协议及其实现方法,熟悉UDP广播、多播的原理及编程方法,掌握混合C/S架构网络通信系统的设计,熟悉HTML,Javascript等Web编程技术及实现方法。
五:数据结构与算法数据结构及算法在嵌入式底层驱动、通信协议、及各种引擎开发中会得到大量应用,对其掌握的好坏直接影响程序的效率、简洁及健壮性。此阶段的学习要重点理解数据结构与算法的基础内容,包括顺序表、链表、队列、栈、树、图、哈希表、各种查找排序算法等应用及其C语言实现过程。
六:C++、QT C++是Linux应用开发主要语言之一,本阶段重点掌握面向对象编程的基本思想以及C++的重要内容。图形界面编程是嵌入式开发中非常重要的一个环节。由于QT具有跨平台、面向对象、丰富API、支持2D/3D渲染、支持XML、多国语等强大功能,在嵌入式领域的GUI开发中得到了广范的应用,在本阶段通过基于QT图形库的学习使学员可以熟练编写GUI程序,并移植QT应用程序到Cortex-A8平台。包括IDE使用、QT部件及布局管理器、信息与槽机制的应用、鼠标、键盘及绘图事件处理及文件处理的应用。
七:Cortex A8、Linux平台开发通过基于ARM Cortex-A8处理s5pv210了解芯片手册的基本阅读技巧,掌握s5pv210系统资源、时钟控制器、电源管理、异常中断控制器、nand flash控制器等模块,为底层平台搭建做好准备。Linux平台包括内核裁减、内核移植、交叉编译、GNU工具使用、内核调试、Bootloader介绍、制作与原理分析、根文件系统制作以及向内核中添加自己的模块,并在s5pv210实验平台上运行自己制作的Linux系统,集成部署Linux系统整个流程。同时了解Android操作系统开发流程。Android系统是基于Linux平台的开源操作系统,该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件,目前它的应用不再局限于移动终端,还包括数据电视、机顶盒、PDA等消费类电子产品。
八:驱动开发驱动程序设计是嵌入式Linux开发工作中重要的一部分,也是比较困难的一部分。本阶段的学习要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发操作。熟悉所开发硬件的工作原理,具备ARM硬件接口的基础知识,熟悉ARM Cortex-A8处理器s5pv210各资源、掌握Linux设备驱动原理框架,熟悉工程中常见Linux高级字符设备、块设备、网络设备、USB设备等驱动开发,在工作中能独立胜任底层驱动开发。
以上就是列出的关于一名合格嵌入式Linux开发工程师所必学的理论知识,其实,作为一个嵌入式开发人员,专业知识和项目经验同样重要,所以在我们的理论学习中也要有一定的项目实践,锻炼自己的项目开发能力。
如果你还想了解更多这方面的信息,记得收藏关注本站。