APP下载

Linux下使用SOCKET编程接口实现C/S通信

2019-09-09董伟梁

数码世界 2019年5期
关键词:电话机监听端口

董伟梁

摘要:套接字(SOCKET)的客户端/服务器(c/s)的通信模型,是基于TCP/IP协议的一种通信方式。本文结合c/s模型和SOCKET工作原理,阐述了socket原理以及如何实现Linux系统下的面向连接的socket通信。

关键字:SOCKET C/S Linux TCP/IP

引言

网络编程的特点就在于它从客户端和服务器两个方面出发,具有监听、请求和连接三个过程。Linux与Unix十分相似,它不仅网络功能非常强大,而且稳定性高,很适合运用到网络编程通信之中。SOCKET作为一种编程接口,在网络协议和应用程序的联系之中扮演者不可或缺的角色。

1 TCP/IP协议结构

TCP/IP协议由网络层IP协议和运输层TCP协议构成,是一种基本的网络协议。其中IP协议管理互联网设备的地址,TCP协议管理数据的传输。TCP/IP协议下,应用程序有两种编程接口,传输层接口(TLI)和套接字接口(SOCKET)。现如今,SOCKET接口已经成为普遍认可的编程接口形式。

2 SOCKET通信原理与模型

SOCKET中文名称套接字,是一种为适应TCP/IP程序开发而设计的一种接口形式。在一个具有两端的通信进程中,一个套接字只能描述其中一端,所以需要其他套接字来描述另一端。

SOCKET在用于网络通信时,取其几个本意中“插座”的意思。套接字就好比是固定电话机和电话线之间的插座,或者说是接口。电话接口对应着一个的电话号码,当乙使用电话机向甲寻求通话时,乙的电话机必须有一个确定的电话号码,同时他也要知道甲的电话号码。即至少在通信时双方各拥有一个固定的SOCKET。这时如果甲处于空闲状态,那么他可以选择接听乙的来电,双方之间的通话连接的得以建立。乙发出的信息是通过电话机处理后传向甲的,同时他收到的信息也是经过电话机接收和处理过的。整个过程总体如下:

(1)服务器和客户端分别建立SOCKET接口。

(2)服务器处于监听状态。客户端描述待连接服务器的SOCKET,发送连接请求。

(3)服务器作出相应,并返回端口号与SOCKET地址。连接建立。

在电话通话时,还存在一种特殊情况。在通话连接建立之后,是丙而不是甲接听电话,那么乙就需要请求甲接听电话。为了能够区分端口,每个SOCKET都会有一个由系统分配的唯一的端口号。在实际SOCKET通信时,服务器中有多个软件进程,当进程与一个端口相绑定后,系统就会把所要发给该进程的信息通过端口号定位到相应端口,再把信息准确无误地发给相应进程。

SOCKET是为客户端/服务器模型(C/S)而开发的。在这种模式下,客户端的SOCKET并不是一定的,好比乙可以使用不同的终端来呼叫甲。然而服务器的SOCKET是固定的,同时对网络中的每个客户端来说,它的SOCKET是已知的。

c/s模型是一种最基本的SOCKET模型,根据不同的发起方向,可以分为面向无连接形式和面向连接形式。UDP协议用于面向无连接的通信形式,该协议提供尽最大努力的服务,但却不具有一定的可靠性,只能通过超时报错和重传机制来维持数据传输的正确性,在网络连接状况良好时尚可,不能适应网络恶劣的环境。而面向连接的通信采用TCP协议,它虽然相比UDP协议要耗费更多的资源,但在一定程度上维持了传输的稳定性,比较能够以适应各种网络环境下的传输工作。

对于面向连接和面向无连接,套接字类型与之相对应分为以下两种形式:

(1)流式套接字(SOCKSTREAM)。

提供面向连接的传输服务。传输过程稳定性强,可靠性高,发生重复、丢失和损坏的坑能动性低,可以通过流量控制来把控传输,数据流服务对象多为连接上的应用。

(2)数据报套接口(SOCKDGARM)

提供面向无连接的传输服务。传输的数据以独立的形式被包装成数据包发送,可靠性较低,发生传输错误的概率较高。

3 Linux下的面向连接的SOCKET编程设计

面向连接的SOCKET即流式套接字,采用TCP协议。基本工作过程如图1所示。

服务器: (1)使用socket()创建流式套接字。(2)通过bind()函数把相应网络地址和套接字关联起来。(3)使用listen()来监听发送到端口的请求。(4)用accept()接受连接请求。无连接请求时,服务器进程处于停滞状态,继续等待客户端。(5)连接建立后,新的流式套接字便会生成,这个套接字会与客户端套接字关联,而原套接字继续处于监听状态。此时可通过read()和write()函数与客户端通信。(6)使用close()可终止连接与服务。

客户端:(1)使用socket()创建流式套接字。(2)通过connect()发送连接服务器请求。(3)连接建立后,可用read()和write()函数与服务器通信。(4)使用close()可终止连接与服务。

服务器和客户端程序编写完成后,使用Linux的程序编译工具GCC和程序调试工具GDB分别对两个程序进行处理。处理完成后,在两个终端内分别运行客户端程序和服务器程序,先令服务器处于监听状态,之后客户端发送文本数据,即可成功建立C/S連接。如图2所示。

4 结束语

套接字作为一种主要的编程接口形式,掌握它的编写和使用十分重要。由于套接字基于c/s通信模型,编程时需要编写服务器和客户端两部分程序,来实现主机之间的可靠通信。

参考文献

[1]李德水.基于SOCKET编程接口的网络通信[J],渭南师范学院学报,2005(02): 69-71.

[2]欧军,吴清秀,裴云,张洪,基于socket的网络通信技术研究[J].网络安全技术与应用,2011(07):19_21.

[3]夏玲,王伟平,客户端与服务器端的Socket通信[J],电脑知识与技术,2009,5(04): 812813.

猜你喜欢

电话机监听端口
一种端口故障的解决方案
为程序或设备在路由器上打开端口
监听“有”道 ——杰夫(美国)
论秘密监听的立法问题
太啰嗦电话机(下)
同声翻译电话机
太啰嗦电话机(上)