您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页Linux下基于socket多线程并发通信的实现

Linux下基于socket多线程并发通信的实现

来源:意榕旅游网
网络与通信

文章编号:1008-0570(2009)05-3-0070-03

《微计算机信息》(管控一体化)2009年第25卷第5-3期

Linux下基于socket多线程并发通信的实现

Theaccomplishmentofmulti-pthreadCommunicationBasedonsocketmodelintheLinux

(四川大学电子信息学院)

王远洋周渊平郭焕丽

WANGYuan-yangZHOUYuan-pingGUOHuan-li

摘要:在Linux下开发网络通信系统可以充分发挥Linux系统出色的网络性能,本文介绍了在Linux操作系统下基于TCP/IP协议Socket套接口的通信机制以及多线程编程知识与技巧,并给出多线程方式实现多用户与服务端(C/S)并发通信模型的详细算法,最后展现了用C编写的多用户与服务器通信的应用实例并附有运行结果及截图。关键词:Linux;套接字;多线程;并发服务器

文献标识码:A中图分类号:TP316.81

术创新

Abstract:DevelopingthenetworkcommunicationsystemintheOSofLinuxcanfullyshowtheexcellentspecialityofLinux,Thispa-perfirstlyintroducedthesocketcommunicationmechanismandtheknowledgeofmulti-pthreadprogramming,anditalsogivesthedetailedalgorithmofmulti-pthreadwaytoaccomplishmulti-clienttoservicemodel.Intheendthispaperexhibitedaexampleap-plicationwhichwrittenbyClanguagewiththeresultphotos.Keywords:Linux;socket;multi-thread;concurrentserver

1引言

Socket是建立在传输层协议(主要是TCP和UDP)上的一种套接字规范,最初由美国加州Berkley大学提出,为UNIX系

统开发的网络通信接口,它定义了两台计算机之间通信的规范,socket屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了Socket规范的计算机之间的通信成为可能,Socket接口是TCP/IP网络最为通用的应用接口,也是在Internet上进行网络程序应用开发最通用的API,本文介绍了Socket通信的基本机制以及采用多线程技术实现并发通信的基本原理,并给出实例。

于开发新的协议或用于提取协议较隐蔽的功能。

2.3套接字的编程原理

本文主要讨论面向连接的流式套接字,我们已经知道,套接字编程均采用客户机/服务器(C/S)的协作模式,即由客户进程向服务器进程发出请求,服务器进程执行被请求的任务并将响应结果返回给客户进程,客户端进程与服务器进程交互的过程如图1所示。

2Socket基本原理

2.1套接字的基本概念

套接字是进行程序间通信(IPC)的一种方法,通信的基石是套接字,在客户机/服务器通信模型当中,一个套接字就是通信的一段,这意味着套接字用来让一个进程和其他的进程互通信息,套接字是网络通信的基本操作单元,它提供了不同主机间进程双向通信的端点,这些进程在通信前各自建立一个

Socket,并通过对Socket的读/写操作实现网络通信功能。

2.2套接字的分类

Linux系统支持多种套接字类型,主要有以下3种:

1)流式套接字(SOCK_STREAM):这是最常用的套接字类型。TCP协议使用此类接口,它提供面向连接的、无差错的网

络信息包的传输。

图1socket通信示意图

服务器端程序的编写步骤:第一步:调用socket()函数创建一个用于通信的套接字。第二步:给已经创建的套接字绑定一个端口号,这—般通过设置网络套接口地址和调用bind()函数来实现。第三步:调用listen()函数使你的套接字成为一个监听套接字。第四步:调用accept()函数来接受客户端的连接,这时就可以和客户端通信了。第五步:处理客户端的连接请求。第六步:终止连接。

客户端程序的编写步骤:第一步:调用socket()函数创建一个用于通信的套接字。第二步:通过设置套接字地址结构,说明客户端要与之通信的服务器的IP地址和端口号。第三步:调用

2)数据报套接字(SOCK_DGRAM):UDP协议使用此类接

口,它是无连接的服务,以的数据报进行网络传输。数据报的最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。

3)原始套接字(SOCK_RAW):提供对网络下层通信协议(如IP协议)的直接访问,它一般不是提供给普通用户的,并主要用

王远洋:研究生硕士

-70-360元/年邮局订阅号:82-946《现场总线技术应用200例》

您的论文得到两院院士关注网络与通信

务器的工作效率,Linux系统支持三种并发方式:多进程、多线程、以及I/O多路复用。而多线程技术是并行技术中开销较小,效率较高的一种方式,与其他两种方式相比,线程占用更少的系统资源,而且效率更高,是并发技术中最常用的方式。其服务器算法如图2所示:

connect()函数来建立与服务器的连接。第四步:调用读写函数发

送或者接收数据。第五步:终止连接。

2.4基本套接字函数1)创建socket函数

intsocket(intdomain,inttype,intprotocol);该调用有三个参数:domain、type、protocol。参数domain指定协议地址簇,type为通信类型,protocol指明socket所用的协议。对于TCP而言,取值分别为:PF_INET,SOCK_STREAM,0。

2)绑定套接字与地址信息

intbind(ints,conststructsockaddr*name,intnamelen);该函

数将套接字地址(本地主机地址和端口地址)与所创建的套接字联系起来。

3)监听连接

intlisten(intsockfd,intbacklog);该函数有两个参数,sockfd是调用socket()返回的套接字文件描述符,backlog表示队列中

允许的最大连接数目。

4)建立套接字连接

intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);该函数有三个参数,sockfd是调用socket()返回的套接字文件描述符,serv_addr是保存着目的地端口和IP地址的数据结构structsockaddr。addrlen为structsockaddr的长度。

5)接受请求

intaccept(intsockfd,structsockaddr*addr,int*addrlen);当

服务器收到来自客户端的连接请求时,调用该函数接受请求。

图2多线程并发服务器算法

3.3主要的线程函数调用

Linux操作系统提供了LinuxThreads库,它是符合POSIX

标准的内核级多线程函数库。在库中提供了一些多线程编程的相关函数,在多线程编程时应包括pthread.h文件,链接时需要用库libpthread。

6)数据传输

intsend(intsockfd,constvoid*msg,intlen,intflags);intrecv(intsockfd,void*buf,intlen,unsignedintflags);这两个函数用于流式套接字的通信,send()函数返回实际发送的数据长度,若小于len,则说明数据没有全部发送,需要进行再次发送剩余的部分。recv()函数返回实际接受的数据长度。sockfd是你想发送数据的套接字描述符,msg是指向你想发送的数据的指针。len是数据的长度。flags通常为0,buf是接受

的信息缓冲区。

1)子线程的创建

intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg);调用此函数可以创建一个新的线程,新线程创建后执行start_routine函数,其中参数attr是线程属性,arg是向start_routine函数传递的参数。当成功创建一个新线程时,系统会自动为新线程分配一个线程ID号,并通过pthread返回给调用者。

2)等待线程结束

intpthread_join(pthread_tthread,void**value_ptr);该函数

挂起当前进程直到所等待的线程结束。

技术创新

7)关闭套接字

intclose(intsockfd);该函数用于关闭套接字连接,sockfd是套接字文件描述符,结束客户进程和服务进程在sockfd上的

通信。

3)线程退出

voidpthread_exit(void*value_ptr);该函数用于终止当前线

程,并返回状态值。

3多线程socket编程

3.1多线程并发的优点

同一进程可以包括多个线程,这些线程共享相同的内存空间,而进程都有各自的内存空间,进程之间通信需要专门的机制,这无疑增加了内核的开销,降低了系统性能。线程带来的开销很小,内核无需单独复制进程的内存空间或文件描述符等,这就大量地节省了CPU时间,使得创建线程比进程的速度快数十倍。另外,多线程程序作为一种多任务、并发的工作方式,还有以下的优点:1)提高应用程序响应时间;2)使多CPU系统更加有效;3)改善程序结构。

4多线程通信系统编程实例

4.1实例功能

下面,我们通过一个具体的实例来说明多线程并发通信系统的具体实现,具体功能为:

服务器端:循环等候客户连接请求,一旦有客户连接请求,开启一个子线程接受并处理客户请求,接受来自客户的信息。然后将客户信息反转后再返回给客户端。主线程继续等待其他客户请求。服务器具有同时处理多个用户的能力。

客户端:首先与服务器建立连接,然后向服务器发送数据进行交互,接受服务器的反馈信息并显示,之后继续等待用户输入直至用户输入ctrl+D结束通信。客户端接到输入ctrl+D后,客户端关闭连接并退出。

3.2多线程并发服务器算法

前面已经讲述了套接字实现的基本方法,但是,在实际应用中,该种服务器运行效率很低,因为它属于重复性服务器,即只有处理完上一个客户请求以后,才能处理下一个客户请求,而采用并发技术可以一次处理多个客户请求,可极大的提高服

4.2实验结果测试

在虚拟机Linux上开三个终端,一个运行server,另外两个分别运行client1和client2,用127.0.0.1本机地址回环进行模

拟测试,具体过程如下:

邮局订阅号:82-946360元/年-71-

《PLC技术应用200例》

网络与通信

1)先编译client.c和server.cgccclient.c–oclient-lpthreadgccserver.c–oserver–lpthread2)运行server:./server

3)分别运行客户端1、2,并输入相应信息./client127.0.0.1

运行结果分别如图3、图4、图5所示:

《微计算机信息》(管控一体化)2009年第25卷第5-3期

套接口API和X/[4](美)W.RichardStevens.Unix网络编程卷一:

施振川等译,北京:清华大学出版社,Open传输接口API[M],

2001:160-163

马礼.多线程并发服务器的实现[J].华北工学院学[5]宋燕红,

报,1998,19-2:124-126

作者简介:王远洋(1984-),男,重庆人(汉族),四川大学电子信息学院研究生,硕士,研究方向:信号与信息处理;周渊平(1955-),男,浙江杭州人(汉族),四川大学电子信息学院教授、博士生导师,博士,研究方向:无线通信理论及系统,智能天线及MIMO技术;郭焕丽(1983-),男,重庆人(汉族),四川大学电子信息学

院研究生,硕士,研究方向:智能天线,自适应信号处理。

图3服务器截图

技术创新

Biography:WANGYuan-yang(1984-),Male(HanNationality),ChongQingProvince,UndergraduatestudentofSchoolofElectronicalInformation,SichuanUniversity,Resarcharea:signalandinformationalprocessing.(610065成都四川大学电子信息学院)王远洋周渊平郭焕丽(SchoolofElectronicalInformation,SichuanUniversity,Chengdu610065,China)WANGYuan-yangZHOUYuan-pingGUOHuan-li

通讯地址:(61006川省成都市四川大学电子信息学院信号与信息处理07研)王远洋

(收稿日期:2009.04.13)(修稿日期:2009.05.15)

(上接第137页)4小结

图4客户1截图

本文作者创新点是:本论文系统采用抽象模型进行设计,具有很强的通用性,对于模型中的抽象设备的具体实现方式不做限定,在实际应用中,可以用硬件实现,也可以用软件实现。模块化的设计使得系统模型具有非常灵活的组网方式,可以根据实际需要设定不同的监控等级。详细介绍了视频传输的各个软件模块的实现,并对软件开发过程中的问题提出了自己的解决方法,保证了视频流网络传输的可靠性和实时性,对系统的进一步改进做了阐述。

图5客户2截图

5小结

由以上截图可知,服务器可以并发响应与多个客户端请求并同时与之通信,这样极大的提高了服务器的运行效率和响应速度,尽管如此,在多线程编程当中还是有很多需要注意的地方,比如说线程安全问题、线程同步等问题。只要正确处理好以上问题,并运用本文提出的多线程并发服务器结构,就可以利用多线程开发出高效实用的大型网络通信应用程序,因此多线程技术具有十分宝贵的应用价值和广阔的应用前景。本文作者创新点:通过Linux下socket通信与多线程编程技巧相结合,实现了并发服务器模型,大大提高服务器工作效率。

参考文献

申楠,金钺.基于SIP的多媒体通信的个性化服务.微[1]邓中亮,

计算机信息,2007,12-3:183-185。

[2]喻超.数字视频监控系统设计与实现.硕士论文,武汉大学,2003.4。

[3]王宏强.嵌入式操作系统在火灾测控系统中的开发与应用研究.硕士论文,合肥工业大学,2003.5。

人民邮电出版社,[4]毕厚杰.多媒体信息的传输与处理.北京:

1999。

人民邮电出版社,[5]胡晓峰等.多媒体系统原理与应用.北京:

1995。

作者简介:邹月(1965-),男(汉族),广东科贸职业学院信息工程系讲师,研究生,主要从事网络技术、多媒体技术研究。

参考文献

李立明.TCP/IP协议下网络编程技术的实现[J].航空[1]周炎涛,

计算技术,2002,32-3:122-125

[2]朱斌.LinuxSocket编程及其在无线网关中的应用[J].微计算机信息,2007,12-2:21-23

人民邮电出版社,[3]天夜创作室.linux网络编程技术[M].北京:

2001:59-60

-72-360元/年邮局订阅号:82-946Biography:ZOUYue(1965-)Male.Han.GuangdongVocationalcollegeofScienceandTrade,InformationEngineering,docent,Area:Networktechnique,multimediatechniqueresearch(5100广东广东科贸职业学院)邹月

(GuangdongVocationalcollegeofScienceandTrade,Guang-dong,5100)ZOUYue

通讯地址:(5100广州天河五山科华街273号9#1002)邹月

(收稿日期:2009.04.13)(修稿日期:2009.05.15)

《现场总线技术应用200例》

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务