哈工大嵌入式系统软件作业 - 基于TCP IP协议的CS通信例程

更新时间:2024-03-21 00:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于TCP协议的C/S通信例程

一、引言

TCP协议是面向“流”的传输层网络协议。相比其他传输层协议具有数据传输可靠性高、使用方便等优点,广泛应用于网络通信中。本文使用Socket接口API实现了TCP协议最基本的客户端、服务器网络通信模型,对网络编程接口有了进一步的认识。

客户端的作用是从命令行参数中获得一个字符串并利用网络接口发送给服务器,然后接收经过服务器处理后的字符串并打印;服务器的作用是接收从客户端传来的字符串,并将其中的每个字符转换为大写之后回送给客户端。

为了模拟不同主机之间的通信,需要分别编写客户端、服务器的代码。客户端需要使用loopback地址(127.0.0.1)与服务器通信从而能够在同一台主机上观察通信效果。本文的客户端、服务器选择使用TCP协议来实现,TCP是一种面向流的高可靠性传输层协议,其基本编程模型如图1所示:

TCP Serversocket()bind()listen()accept()TCP Clientsocket()阻塞等待连接建立连接connetc()read()write()数据数据write()read()close()

close()图1 TCP编程模型

二、程序编写

本文严格按照图1所示的流程编写了客户端、服务器程序。

服务器的编程要点是:

? 调用socket()函数建立套接口描述符,在参数中指定网络层使用IPv4协

议、传输层使用TCP协议。从下文可以看到,该套接口描述符用于监听来自指定端口和IP地址的网络连接请求,并不用于具体的通信过程。 ? 建立服务器的sockaddr_in结构,该结构是IPv4的地址结构。客户端需

要知道服务器的网络地址和端口号才能向特定服务器发起连接请求。因此服务器程序所监听的端口号通常是固定不变的。此处在sockaddr_in结构中指定服务器端口号为8000。调用bind()函数将上文中的套接口描述符与该地址结构绑定。 ? 调用listen()函数使得上文中的套接口描述符成为被动接受连接的服务

器程序,指定连接队列长度为20。 ? 调用accept()使服务器监听socket描述符所指定IP地址和端口号。如果

此时客户端发起了连接请求,而且“三次握手”过程顺利完成,accept()会返回一个新建的socket描述符。应用程序可以使用该描述符完成与服务器间的具体通信任务。 ? 使用accept()返回的描述符、调用read()函数读取客户端发来的字符串并

保存到本地缓冲区。read()会阻塞直到客户端发来字符串,返回值为实际传输的字节数。使用toupper()函数转换为大写后发送回客户端。

客户端的编程要点是:

? 从命令行参数中获取用户输入的字符串并存入本地缓冲区。若输入格式

不符合要求则打印正确的使用方式作为提示。 ? 调用socket()函数建立套接口描述符,后面将使用此描述符与服务器通

信。 ? 建立sockaddr_in结构,该结构用于描述服务器的地址结构;此处指定

服务器的IP地址为127.0.0.1;调用connect()函数使用客户端建立的socket描述符与sockaddr_in指定的服务器通信,以完成“三次握手”过程。 ? 调用write()将缓冲区的字符串发送给服务器。

? 调用read()接收经过服务器处理的字符串,并调用write()将这些字符串

显示在标准输出。 三、编译与运行 (1) 运行环境

linux内核版本:3.11.10-301.fc20.i686+PAE gcc编译器版本:4.8.2 20131017 (Red Hat 4.8.2-1) (2)编译过程 gccserver.c –o server

gccclient.c –o client (2) 运行结果 服务器端:

客户端:

本文来源:https://www.bwwdw.com/article/lpo8.html

Top