Linux环境下基于TCP的Socket编程浅析 (1).pdf
《Linux环境下基于TCP的Socket编程浅析 (1).pdf》由会员分享,可在线阅读,更多相关《Linux环境下基于TCP的Socket编程浅析 (1).pdf(4页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux 环境下基于 TCP 的 Socket 编程浅析吴佩贤(绍兴文理学院 计算机系浙江 绍兴312000)摘要:Socket适用于同一台计算机上的进程间通信,同时也适用于网络环境中的进程间通信。他已成为当前许多操作系统的网络API,也是网络操作系统中必不可少的基础功能。因特网为网络中的应用提供了 2 种类型的服务:由T CP协议提供的面向连接服务和由U DP 协议提供的无连接服务。随着 Linux 操作系统的不断推广,Linux 环境下的 Socket 开发和研究一直是人们关注的热点。文章介绍了 Linux 平台下的 Socket 及其在 TCP 协议下的编程原理,并通过一个用 Java
2、 编写的基于T CP的客户/服务器程序,描述了网络中不同主机上的两个进程之间的Socket通信机制。关键词:Socket;T CP/IP;客户机/服务器;进程;Java中图分类号:TP316文献标识码:B文章编号:1004373X(2005)1605303Analysis of Socket Programming TCPbased on LinuxWU Peixian(Computer Science Department,Shaoxing University,Shaoxing,312000,China)Abstract:Socket is suitable for communicati
3、on between two processes not only from one computer but also from network.NowSocket is an available networkAPI of many OS,at the same time,it is one necessary part of networkOS.Internet providesconnection-oriented service(T CPbased)and connectionless service(U DPbased).Socket development and studyin
4、g on Linux arealways concerned while Linux is innovated on and on.T he paper introduces the Socket and it s programming principle based on T CP inLinux environment.By using a T CPbased client/server program which is edited in Java,it describes Socket communicationmechanism between the two processes
5、from the different computers in the network.Keywords:Socket;T CP/IP;client/server;process;Java收稿日期:20050405Linux是一个诞生于Internet和WWW的产品,他和网络密切相关。Linux网络系统具有稳定、简易、高效、兼容性好等特点,并且支持多种网络协议,如 IP v4,IP v6,X.25,IPX,NET BIOS,DDP 等。套接字(Socket)是介于网络应用层和传输层之间的编程接口,套接字接口提供了访问下层通信协议的大量系统调用和相应的数据结构。在 Linux 中,套接字接口是应
6、用程序访问下层的网络协议的惟一方法。具体讲,套接字在用户级实现了两个应用程序之间的网络连接和数据交换,所以 Linux 中的套接字意味着网络上的连接。套接字在 TCP/IP 网络模型中的地位如图 1 所示。图 1套接字1BSD 套接字接口Socket 接口是为方便开发人员进行 T CP/IP 程序开发,而为 TCP/IP 协议所制定的一组应用程序接口。由于他最早应用于伯克莱大学的BSD Unix中,所以习惯上又称其为BSD Socket(简称BSD)。一个套接字描述为一个通信连接的一端,在一个通信连接中的两端通信程序应各自有一个套接字来描述他们自己那一端,不同主机中的两个进程通过各自的套接字发
7、送和接收消息,从而实现进程间跨网络的通信。Linux 的套接字支持多种网络协议,不同类型网络协议的工作方式不同,所使用的地址格式也完全不同。对于各种网络协议而言,使用相同地址格式的几个协议称为一个协议地址簇,表 1 列出了 BSD 套接字的常见地址簇。表 1BSD 套接字地址簇的主要类型地址簇类型对应的通信协议AF_INETT CP/IP 协议AF_IPXNovell IPX 协议AF_UNIXUnix 内部套接字AF_AX25AX.25 协议套接字AF_APPLETALKAPPLET ALK DDS(Macintosh机器用)Linux将套接字地址簇抽象为统一的BSD套接字接53 现代电子技
8、术2005 年第 16 期总第 207 期嵌入式与单片机口,该接口是应用程序的开发接口,由各地址簇专有的软件支持。Linux BSD Socket 支持以下常见套接字类型:(1)SOCK_STREAM(数据流套接口):提供一个面向连接的双工顺序数据流传输和可靠的数据传输服务。这种套接字可以保证数据传输的可靠性,不会出现数据丢失、破损或重复出现等差错,而且通过流量控制避免发送的数据流超限。Internet地址中的TCP协议支持流套接字。(2)SOCK_DGRAM(数据报套接口):提供一个无连接和不可靠的双工数据传输服务。数据包以独立包形式被发送和接收。不对数据的传输提供无错保证,即数据可能被丢失
9、、破坏,也可能被重复接收。Internet 地址中的UDP协议支持这种套接字。(3)SOCK_RAW(原始套接口):这种类型的套接字允许对低层协议如 IP 或 ICMP 直接访问,可以直接填充IP,TCP,UDP 或者 ICMP 的包头,发送用户自己定义的IP包或者ICMP包。主要用于一些协议的开发,在网络安全的抓包中有重要的应用。2Linux 平台下的 Socket 编程原理在 Linux 中,Socket 属于文件系统的一部分,网络通信可以被看作是对文件的读取。这使得用户对网络的控制极为方便,Linux的许多特性都非常有助于网络编程:首先,Linux 拥有 POSIX 标准库函数,Sock
10、et(),bind(),listen(),send(),accept()这几个库函数可以方便地实现客户机/服务器模型中数据的传送与接收。其次,Linux 的进程管理策略也非常适合服务器的工作环境,Linux 中的每个进程都对应一个父进程,同时他也能创建多个子进程。在服务器端可以用父进程去侦听客户机的连接请求,当有客户机的连接请求发生时,父进程创建一个子进程去建立连接线路并与该客户机通信,而他本身可继续侦听其他客户机的连接请求,这样就可避免当有一个客户机与服务器建立连接后服务器就不能再与其他客户机通信的问题。最后,Linux 传承了 Unix 设备无关性这一优秀特性,即通过文件描述符实现了统一的
11、设备接口:磁盘、显示终端、音频设备、打印设备甚至网络通信都使用统一的I/O调用。这 3 个特性大大方便和简化了 Linux 环境下的网络程序设计。(1)Socket 函数Socket()用来创建套接口描述符,其格式声明为:int Socket(int domain,int type,int protocol)参数 domain 说明网络程序所在的主机采用的通信协议,如 AF_INET(IP v4 协议),AF_INET6(IP v6 协议),AF_LOCAL(Unix域协议);参数type指定套接口类型(数据流套接口、数据报套接口、原始套接口),即相当于指明 了网络程 序所采 用的通 信协议(
12、TCP 还是UDP);参数protocol由于指定了type,一般取 0 即可。(2)bind函数bind()用来将套接口绑定到本地计算机的某一端口,其格式声明为:int bind(int sockfd,struct sockaddr*my_addr,intaddrlen)sockfd为套接口描述字;指针my_addr指向sockaddr结构,该结构包含了远程服务程序的IP地址与端口号;addrlen 指明 sockaddr 结构的长度。(3)listen 与 accept 函数服务器端通过 listen()等待一个进入的连接请求,接收到的请求存于队列中。当有多个客户端和服务器相连时,通过参数
13、backlog指定队列的最大长度。accept()则从已接收的连接请求队列中取出请求并分析这个请求,若队列为空,则使服务器端程序阻塞。本文主要阐述的是面向连接的数据流通信的 Socket编程过程。客户机/服务器主要编写客户程序和服务器程序,以下是主要的编程框架。面向连接的数据流通信中,服务器端程序基本的编写步骤如图 2 所示。首先,在服务器端使用Socket()建立一个通信端口,再用 bind()命令把一个地址绑定到这个端口上。然后,服务器端使用 listen()侦听连接请求,当远程的客户机试图通过 connect()连接 listen()正在侦听的端口时,连接将会在队列中等待,直到使用acc
14、ept()处理他。在accept()处理了连接请求后,将会生成一个新的描述这个连接端口的套接字,利用这个套接字就可以发送和接收数据了。如果 listen()一直没有侦听到连接请求,那么服务器任务就会在 accept()处阻塞(在阻塞模式下),一直到有连接请求到来。不论何种编程语言,和 Socket 打交道都是这一 组调用,只是在格式上有所区别。Visual Basic采用WinSock控 件,C+Builder采 用TclientSocket元 件 和TserverSocket 元 件,Visual C+采 用 MFC 类 中 的CAsyncSocket 类 和 CSocket 类,Java
15、中 通过 J.Socket 和 J.ServerSocket 类库来实现网络之间的通讯。图 2TCP客户机/服务器程序的工作流程54计算机应用吴佩贤:Linux 环境下基于 T CP 的 Socket 编程浅析对于客户机任务,他也需要先用Socket()建立一个通信端口,但是不必用bind()把一个本地地址绑定到这个端口上,而是直接使用connect()向指定的服务器发送连接请求。函数connect()调用成功后,套接口描述字就与远程服务程序建立好了连接,建立连接后通过send()和recv()实现数据的发送与接收。send()返回实际发送的字节数,如果返回的字节数比要发送的字节数少,则在以后
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux环境下基于TCP的Socket编程浅析 1 Linux 环境 基于 TCP Socket 编程 浅析
限制150内