实验三、嵌入式Linux网络通信实验

实验三、嵌入式Linux网络通信实验

一、实验目的

1. 掌握TCP与UDP协议原理

2. 掌握套接字通信原理。

2. 掌握TCP套接字服务器端与客户端通信方法。

二、实验基本要求

1. 学习TCP与UDP协议原理。

2. 掌握TCP套接字服务器端与客户端通信方法,实验箱和Ubuntu进行TCP通信。

三、实验原理

1TCP协议与UDP协议

   TCP协议(传输控制协议)是面向连接的通信协议,TCP提供两台计算机之间的可靠无差错的数据传输。应用程序利用TCP进行通信时,客户端和服务器端之间建立一个套接字连接,可以把套接字连接想象为一个电话呼叫,只有呼叫成功时,双方就能进行通话。建立连接的两计算机之间就可以把数据当作一个双向字节流进行传输。一般把在最初建立呼叫时,主动呼叫方称为“客户端”,负责监听方称为“服务器端”。

   UDP协议(用户数据报协议)是无连接通信协议,UDP不保证可靠的数据传输。如果一个主机向另一个主机发送数据,无需建立连接就会直接将数据发出去,而不管另一台主机是否准备接受数据。如果另一个主机收到了数据,它不会向对方发送收到确认信息。这一过程,类似于从邮局发送信件,无法确认收信人一定能收到发出去的信件。

2.套接字概述

   通过IP地址可以在网络上找到主机,通过端口号找到主机上正在运行的程序(进程)。也就是说,网络通信不能简单地说成是两台计算机之间的通信,而是两台计算机上执行的应用程序间收发数据。套接字就是IP地址和端口号的组合,用以表征一个虚拟的文件句柄。

   根据网络传输协议类型的不同,套接字分为以下三种类型:

(1)字节流套接字。又称TCP套接字,基于TCP协议连接和传输方式,能保证数据传输的正确性和顺序性。

(2)数据报套接字。又称UDP套接字,基于UDP协议的连接和传输方式,它定义了一种无连接的服务,数据通过相互独立的数据报进行传输,并且无需对传输的数据进行确认,传输速度快。

(3)原始套接字。原始套接字允许对底层协议如IP或IMCP进行直接访问,主要用于对一些协议的开发,构造自己的数据报分组。

3TCP套接字通信步骤

3.1 服务器端

(1)调用socket()创建套接字,然后初始化struct sockaddr_in结构体。

(2)调用bind函数()为套接字绑定一个IP地址和一个端口号。

(3)调用listen()函数使套接字成为监听套接字,侦听指定的端口。

(4)调用accept()函数,使服务器处于阻塞状态,等待接受客户端连接请求。一旦建立连接,将产生新的套接字,此时就有两个套接字了,原来的那个套接字还在监听等待指定的端口,而新产生的套接字则准备发送或接受数据。

(5)利用send/sendto和recv/recvfrom进行数据传输。当然也可以调用write或read.

(6)数据传输完毕,关闭套接字。

3.2 客户端

(1)调用socket()创建套接字,然后初始化struct sockaddr_in结构体,注意服务器端和客户端的struct sockaddr_in结构体应该一致。

(2)调用connection()函数与服务器建立连接。

(3)利用send/sendto和recv/recvfrom进行数据传输. 当然也可以调用write或read.

(4)数据传输完毕,关闭套接字。

4.头文件

Berkeley套接字接口的定义在几个头文件中。这些文件的名字和内容与具体的实现之间有些许的不同。大体上包括:

<sys/socket.h>:核心BSD套接字核心函数和数据结构。AF_INET、AF_INET6 地址集和它们相应的协议集PF_INET、PF_INET6. 广泛用于Internet,这些包括了IP地址和TCP、UDP端口号。

<netinet/in.h>:AF_INET 和AF_INET6 地址家族和他们对应的协议家族 PF_INET 和 PF_INET6。在互联网编程中广泛使用,包括IP地址以及TCP和UDP端口号。

<sys/un.h>:PF_UNIX/PF_LOCAL 地址集。用于运行在一台计算机上的程序间的本地通信,不用于网络通讯。

<arpa/inet.h>:处理数值型IP地址的函数。

<netdb.h>:将协议名和主机名翻译为数值地址的函数。搜索本地数据以及DNS。

5.套接字API函数

这个列表是一个Berkeley套接字API库提供的函数或者方法的概要:

(1)socket() 创建一个新的确定类型的套接字,类型用一个整型数值标识(文件描述符),并为它分配系统资源。

(2)bind() 一般用于服务器端,将一个套接字与一个套接字地址结构相关联,比如,一个指定的本地端口和IP地址。

(3)listen() 用于服务器端,使一个绑定的TCP套接字进入监听状态。

(4)connect() 用于客户端,为一个套接字分配一个自由的本地端口号。如果是TCP套接字的话,它会试图获得一个新的TCP连接。

(5)accept() 用于服务器端。它接受一个从远端客户端发出的创建一个新的TCP连接的接入请求,创建一个新的套接字,与该连接相应的套接字地址相关联。

(6)send()和recv(),或者write()和read(),或者recvfrom()和sendto(), 用于往/从远程套接字发送和接受数据。

(7)close() 用于系统释放分配给一个套接字的资源。如果是TCP,连接会被中断。

(8)inet_addr()用于将一个网络地址字符串转换成一个32位二进制网络IP地址。

(9)htons()用于将一个int端口号转换成一个16位二进制网络字节序。

四、实验内容

1. 通过实验指导书或者网络资源,学习TCP套接字原理及应用方法。

2. 请补充以下server.c和client.c中代码。本实验中实验箱和Ubuntu,把其中一个当作服务器,一个当作客户端,执行编译生成的可执行程序,进行通信。观察通信结果。

(1)server.c 中部分代码如下,可把文档放大后再查看代码:

(2)client.c 中部分代码如下,可把文档放大后再查看代码:

五、实验结果及分析

1.简述TCP协议与UDP协议原理

2.描述TCP服务器端套接字通信过程。

3.描述TCP客户端端套接字通信过程。

4.自己尝试编写UDP套接字通信程序,并进行测试。


 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软件源码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值