嵌入式Linux-Socket套接字通信-Class_1

一、实验目的

1、掌握TCP&UDP调试助手、TCP调试助手的使用;

2、掌握 Linux C/S socket编程基本方法与代码;

二、实验内容

1、启动Ubuntu Linux虚拟机,并使用root登录,调试好Linux虚拟机与Windows系统的网络连接。

2、 “TCP调试助手”(tcpassistv11.zip)的使用,(建议先找到主程序,单击鼠标右键,选择以“管理员身份运行”该可执行程序):

(1)、解压tcpassistv11.zip,运行“TCP调试助手(V1.11).exe”,建立一个端口为8888的TCP服务器;

(2)、根据Ubuntu linux虚拟机与Windows主机的网络连接模式设置,以及(运行了TCP调试助手)的windows主机的ip地址修改“cjson_socket-ok”目录中代码中的目标服务器地址,在Ubuntu Linux中编译运行该代码,观察windows系统中“TCP调试助手”中的数据接收情况。

3、把代码“linux-socket-C-S”、复制到Linux虚拟机的,修改代码,使其能在当前虚拟机中运行,使用gcc编译,然后开启2个终端,分别运行server、client,测试其运行效果,并分析查看代码。

4、阅读分析调试并理解教材第九章tcp与udp通信的代码,其客户端、服务器代码位于压缩包arm-linux-ch-9-code-demo.zip中。

*5、socket编程任务题,编写一个Linux socket服务端C程序。

该程序能接收“cjson_socket-ok”目录中代码对应的socket客户端发来的json数据,结合代码中json数据格式的内容,编写接收json数据的客户端C代码,调用cjson 库解码出具体的json数值,打印到终端屏幕上。

说明:Cjason库的代码位于cJSON.ccJSON.h文件中

三、实验环境

安装有vmware软件的window主机,Ubuntu12.04 Linux虚拟机,TCP/UDP调试助手软件。

四、实验步骤

(描述实验步骤及中间的结果或现象。在实验中做了什么事情,怎么做的,发生的现象和中间结果)

  1. 启动Ubuntu Linux虚拟机,并使用root登录,调试好Linux虚拟机与Windows系统的网络连接。

    1. 启动 Ubuntu Linux 虚拟机,使用 root 账号登录系统。
    2. 打开终端,输入ifconfig命令查看虚拟机的网络配置信息,确保虚拟机已连接网络且与主机在同一网段。本实验中虚拟机的 IP 地址为192.168.207.207。
  2. TCP调试助手”(tcpassistv11.zip)的使用,(建议先找到主程序,单击鼠标右键,选择以“管理员身份运行”该可执行程序):

    1. 解压 tcpassistv11.zip,找到 “TCP 调试助手 (V1.11).exe” 可执行文件,双击运行。在程序界面中,选择 “TCP Server” 模式,于指定位置输入端口号 “8888”,随后点击 “开始监听” 按钮,确保服务器进入正常监听状态,准备接收来自客户端的数据。
    2. 根据 Ubuntu linux 虚拟机与 Windows 主机的网络连接模式,在 Windows 系统中打开命令提示符(CMD),输入ipconfig命令,查找与虚拟机处于同一网段的网络适配器的 IPv4 地址。本实验中获取到的主机 IP 地址为192.168.207.168。
    3. 接着在 “cjson_socket - ok” 目录中的代码里找到定义服务器地址的宏(如#define WEB_SERVER_HOST "192.168.207.168"),将其修改为获取到的主机 IP 地址,确保客户端能够正确连接到服务器。
  1. 确保虚拟机已经连上网并且和主机在同一个网段下:192.168.207.207
    1. 先用ipconfig查看主机IP:192.168.207.168
    2. 修改代码中服务器IP为主机IP:192.168.207.168:
    3. make编译cjson_socket-ok程序:
    4. 先设置TCP调试助手中的“远程主机”IP为虚拟机IP:192.168.207.207,本地端口修改为8888(和有安排在Linux中执行的代码中设置的一样),点击监听
    5. 然后运行linux客户端代码,客户端发送给服务器的数据可以在TCP调试助手中看到,如下:

  1. 把代码“linux-socket-C-S”复制到Linux虚拟机的,修改代码,使其能在当前虚拟机中运行,使用gcc编译,然后开启2个终端,分别运行server、client,测试其运行效果,并分析查看代码。具体操作:
    1. 打开终端,使用cd命令切换到代码所在目录。使用ls命令查看目录中的文件,确保client.c和server.c文件存在。
    2. 使用gcc编译代码,对于client.c,执行gcc -o client client.c命令进行编译,生成可执行文件client;对于server.c,执行gcc -o server server.c命令进行编译,生成可执行文件server。在编译过程中,若遇到警告或错误,需详细记录错误信息,并依据错误提示进行相应修改。例如,若出现 “隐式声明函数” 警告,可能需包含相应头文件;若出现 “找不到库” 错误,需检查库的安装路径和链接方式是否正确。
    3. 开启两个终端,在一个终端中输入./server启动服务器端程序,观察服务器端的启动信息和输出。
    4. 在另一个终端中输入./client启动客户端程序,注意观察客户端连接服务器的过程以及数据传输和交互的情况。若客户端连接失败,检查服务器是否正常运行、端口是否被占用以及客户端代码中的服务器地址和端口设置是否正确。
    5. 用gcc分别编译client.c和server.c代码后,先执行服务器端代码,后执行客户端代码,否则客户端连不上(refused)
    6. 客户端和服务器通信结果截图如下:
  2. 阅读分析调试并理解教材第九章tcp与udp通信的代码,其客户端、服务器代码位于压缩包arm-linux-ch-9-code-demo.zip中。
    1. 解压arm - linux - ch - 9 - code - demo.zip压缩包:使用unzip arm - linux - ch - 9 - code - demo.zip命令进行解压,解压后会在当前目录下创建一个名为arm - linux - ch - 9 - code - demo的目录,其中包含echo_client.c、echo_serv.c、time_client.c和time_serv.c等文件。
    2. 打开代码文件,查看代码结构、函数定义和逻辑流程。例如,对于echo_server.c,分析其如何创建套接字、绑定地址、监听连接以及处理客户端数据的回显功能;对于time_server.c,了解其如何获取当前时间并将时间信息发送给客户端。同时,对比不同代码之间的差异和共同点,加深对 TCP 和 UDP 通信原理的理解。

*5、socket编程任务题,编写一个Linux socket服务端C程序。

该程序能接收“cjson_socket-ok”目录中代码对应的socket客户端发来的json数据,结合代码中json数据格式的内容,编写接收json数据的服务器端C代码,调用cjson 库解码出具体的json数值,打印到终端屏幕上。

说明:Cjason库的代码位于cJSON.ccJSON.h文件中

    1. 了解客户端发送的 JSON 数据格式,根据格式定义相应的数据结构(如果需要),以便于在服务器端解析和处理数据。
    2. 创建一个新的 C 文件(例如server.c),在文件中包含必要的头文件,如<stdio.h>、<stdlib.h>、<string.h>、<unistd.h>、<sys/types.h>、<sys/socket.h>、<netinet/in.h>和"cJSON.h"。
    3. 使用socket函数创建一个 TCP 套接字,指定协议族为AF_INET,套接字类型为SOCK_STREAM。
    4. 设置服务器地址结构体sockaddr_in,将地址族设置为AF_INET,端口号设置为与客户端约定的端口(例如8888),IP 地址设置为INADDR_ANY表示监听所有可用网络接口。
    5. 使用bind函数将套接字与服务器地址绑定。
    6. 使用listen函数开始监听客户端连接,设置监听队列长度(例如5)。
    7. 进入一个循环,使用accept函数接受客户端连接请求,返回一个新的套接字用于与客户端通信。
    8. 在子进程(通过fork函数创建)中处理客户端连接:
      • 使用read函数接收客户端发送的数据,将数据存储在一个缓冲区中。
      • 使用cJSON_Parse函数解析接收到的 JSON 数据,判断解析是否成功。
      • 如果解析成功,使用cJSON_GetObjectItemCaseSensitive函数获取 JSON 数据中的各个字段值(如monitor_code、monitor_type和monitor_data),并将其打印到终端屏幕上。
      • 使用cJSON_Delete函数释放解析后的 JSON 对象占用的内存。
      • 使用write函数向客户端发送响应数据(如果需要)。
      • 关闭与客户端通信的套接字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值