tcpip实验报告
TCP IP网络协议分析实验报告

TCP/IP网络协议分析实验一、实验目的1. 通过实验,学习和掌握TCP/IP协议分析的方法及其相关工具的使用;2. 熟练掌握 TCP/IP体系结构;3. 学会使用网络分析工具;4. 网络层、传输层和应用层有关协议分析。
二、实验类型分析类实验三、实验课时2学时四、准备知识1.Windows 2003 server 操作系统2.TCP/IP 协议3.Sniffer工具软件五、实验步骤1.要求掌握网络抓包软件Wireshark。
内容包括:●捕获网络流量进行详细分析●利用专家分析系统诊断问题●实时监控网络活动●收集网络利用率和错误等2.协议分析(一):IP协议,内容包括:●IP头的结构●IP数据报的数据结构分析3.协议分析(二):TCP/UDP协议,内容包括:●TCP协议的工作原理●TCP/UDP数据结构分析六、实验结果1.IP协议分析:(1)工作原理:IP协议数据报有首部和数据两部分组成,首部的前一部分是固定长度,共20字节,是IP数据报必须具有的。
首部分为,版本、首部长度、服务类型、总长度、标识、标志、片偏移、生存时间、协议、首部检验和、源地址、目的地址、可选字段和数据部分(2)IPV4数据结构分析:2.TCP协议分析:(1)工作原理:TCP连接是通过三次握手的三条报文来建立的。
第一条报文是没有数据的TCP报文段,并将首部SYN位设置为1。
因此,第一条报文常被称为SYN分组,这个报文段里的序号可以设置成任何值,表示后续报文设定的起始编号。
连接时不能自动从1开始计数,选择一个随机数开始计数可避免将以前连接的分组错误地解释为当前连接的分组。
(2)TCP数据结构分析第一次握手:第二次握手:第三次握手:3.UDP协议分析:(1)工作原理:与我们所熟悉的TCP一样,UDP协议直接位于IP的顶层。
根据OSI(开放系统互联)参考模型,UDP和TCP都属于传输层协议。
UDP的主要作用是将网络数据流量压缩成数据报的形式。
TCPIP实验报告三正式

广东海洋大学
余乃飞
一.实验目的
1)理解客户机/服务器模型的工作原理
2)掌握套接字的概念。
3)掌握基于套接字的面向连接和无连接客户机/服务器程序的设计原理,了解相关的WINSOCK API 函数。
4)了解基于TCP和UDP 的程序设计方法。
二.相关示意图
三.实验程序与结果
多线程
读取来自客户机的命令,根据客户机的命令,决定服务器要发给客户机的信息,并发送给客户机。
多线程服务器程序。
服务器与客户端交互协议(实现服务器端与客户端交互的协议。
)
客户端源程序。
实验结果
UDP编程
利用DatagramSocket查询端口占用情况。
实验结果
利用数据报通信的C/S程序。
客户端
UDP服务器的程序。
实验结果
四.实验总结
通过这几次实验,使我对套接字编程有了初步的了解,也开了个头,这些编程很有趣,至少是我这样认为,因为有趣,所以有热情,我会在这方面多下功夫的,相信我会做得更好(至少相对自己来说)。
还有,我认为,要学好
套接字编程,至少学好其原理,就如上面的,如果你可以照着流程图编,相信很快就可以编出来了,同理,看程序也一样,要明程序,就先看流程图,了解其中的原理所在,这样就可以做到事半功倍了哦。
同时写程序的时候一定要学会分部分来写,这样就会很容易解决从中遇到的问题。
TCP(IP)组网技术实验报告模板5个

郑州轻工业学院TCP/IP组网技术实验报告学生姓名:宋苗苗专业班级: 3G软件13-02班学号: 541313140237 指导教师: 程立辉实验时间: 2016年4月21日至2016年6月9日成绩:目录实验一配置动态路由RIP (3)实验二配置静态路由 (7)实验三 Cisco VTP (13)试验四 PPP数据链路层协议 (21)实验五 Cisco EIGRP内部网关路由协议 (25)题目一配置动态路由RIP 一:实验目的1.了解掌握动态路由的相关知识;2.掌握了解RIP协议相关知识及应用;3.掌握如何用RIP协议实现动态路由的配置。
二:实验拓扑配置前拓扑图:配置后拓扑图:三:实验过程3.1路由器的基本配置3.1.1 路由器Router0的基本配置3.1.2 路由器Router1的基本配置3.1.3 路由器Router2的基本配置3.2 RIP路由协议配置3.2.1 路由器Router0的RIP路由协议配置3.2.2 路由器Router1的RIP路由协议配置3.2.3 路由器Router2的RIP路由协议配置3.3 RIP路由协议启用第二版3.4配置PC端的IP地址,如下:3.5 查看各路由器的路由表信息3.5.1 查看Router0路由表信息3.5.2 查看Router1路由表信息四:实验结果使用ping检查计算机不同网段互通情况五:实验总结通过本次实验,我了解了配置动态路由器方法和相关配置命令;掌握了路由器的RIP协议的配置方法;理解路由器连接不同类型网络的原理,而且在配置过程在需要特别注意各个路由器之间的连通性,确保其的正常联通。
遇到问题:动态路由器配置过程中对于网络IP的互通问题不是很清楚,通过查找资料,最终实现了动态路由配置。
题目二配置静态路由一:实验目的1.了解掌握静态路由的相关知识;2.掌握了解静态路由通信原理;3.掌握如何用实现静态路由的配置。
二:实验拓扑配置前拓扑图:配置后拓扑图:三:实验过程3.1路由器的基本配置3.1.1Router0的基本配置3.1.2 Router1的基本配置3.1.3 Router2的基本配置3.2为每个路由器配置静态路由3.2.1为路由器Router0配置到路由器Router1通信的静态路由3.2.2配置路由器Router1配置到路由器Router0的返回路径其余配置同上。
TCP_IP攻击实验_实验报告

中南大学TCP/IP攻击实验实验报告学生学院信息科学与工程学院专业班级完成时间 2015年11月29日目录1.实验描述 (3)2.实验步骤 (3)2.1 环境搭建 (3)2.2 实验1:ARP缓存中毒 (4)2.3 实验2:ICMP重定向攻击 (6)2.4 实验3:SYN洪流攻击 (7)2.5 实验4:在telnet和ssh连接上的TCP RST攻击 (10)2.6 实验5:对视频流应用程序的TCP RST攻击 (12)2.7 实验6:ICMP盲目连接重置和源端关闭攻击 (12)2.8 实验7:TCP报文劫持 (13)3.总结 (14)TCP/IP攻击实验1.实验描述【实验背景】由于TCP/IP协议是Internet的基础协议,所以对TCP/IP协议的完善和改进是非常必要的。
TCP/IP协议从开始设计时候并没有考虑到现在网络上如此多的威胁,由此导致了许多形形色色的攻击方法,一般如果是针对协议原理的攻击(尤其DDOS),我们将无能为力。
TCP/IP攻击的常用原理有:(1)源地址欺骗(Source Address Spoofing)、IP欺骗(IP Spoofing)和DNS欺骗(DNS Spoofing);(2) 路由选择信息协议攻击(RIP Attacks);(3) 源路由选择欺骗(Source Routing Spoofing) ;(4) TCP序列号欺骗和攻击(TCP Sequence Number Spoofing and Attack)。
【实验目的】基于TCP/IP协议进行攻击实验,了解TCP/IP协议的具体机制。
2.实验步骤2.1 环境搭建这里我使用三台虚拟机做实验,其中一个用于攻击;另一个用于被攻击;第三个作为观察者使用;把三台主机放在同一个LAN中,其配置信息参照如下所示(实际在实验过程中有所改动):这里我使用的是SEED实验室已经搭建好,并且已经安装好相关的netwox工具箱和Wireshark工具箱的Ubuntu系统,与此同时三台虚拟机都需要打开FTP和Telnet服务:使用如下命令来完成上述任务Start the ftp server# servicevsftpd startStart the telnet server# serviceopenbsd-inetd start2.2 实验1:ARP缓存中毒【实验背景】ARP缓存是ARP协议的重要的一部分。
实验四TCPIP协议属性设置报告

实验四TCPIP协议属性设置报告1.实验目的与简介TCP/IP(传输控制协议/因特网协议)是互联网使用的主要协议之一,它提供了网络通信中的可靠数据传输和连接服务。
本实验旨在通过设置TCP/IP协议的属性,来了解和掌握TCP/IP协议的一些基本特性和优化方法。
2.实验环境本实验使用Windows操作系统,并以本地局域网为实验网络环境。
实验中使用的工具主要包括网络设置界面和命令行窗口。
3.实验步骤3.1设置IP地址和子网掩码在Windows操作系统中,可以通过进入网络设置界面来设置本机的IP地址和子网掩码。
IP地址是用于区分不同计算机和其他网络设备的唯一标识,而子网掩码用于定义本地网络的范围。
3.2设置默认网关默认网关是指当计算机要向其他网络发送数据时,首先会将数据包发送到默认网关。
在网络设置界面中,可以设置默认网关的IP地址。
默认网关通常是本地局域网内连接互联网的路由器。
3.3设置DNS服务器DNS(域名系统)服务器用于将域名转换为对应的IP地址。
在网络设置界面中,可以设置DNS服务器的IP地址。
一般来说,可以使用本地路由器或者互联网服务提供商提供的DNS服务器。
3.4设置TCP/IP属性通过命令行窗口可以使用"ipconfig"命令查看当前TCP/IP属性的详细信息。
可以通过命令行窗口中的一系列命令来设置TCP/IP属性,例如设置TCP缓冲区大小、调整TCP拥塞控制算法等等。
3.5实验结果与分析设置完TCP/IP属性后,可以使用一些网络性能测试工具来评估网络连接的质量和性能。
例如可以使用Ping命令检测网络延迟和丢包率,使用速度测试工具来测试网络带宽等等。
4.实验总结与心得TCP/IP协议是互联网中最常用的通信协议之一,对于网络通信的质量和性能具有重要影响。
通过实验,我了解到TCP/IP协议的一些基本特性和连接调优方法,并且掌握了调整TCP/IP属性的操作方法。
在实验过程中,我发现通过调整TCP缓冲区大小可以提高TCP连接的传输速度,并且可以通过调整TCP的拥塞控制算法来改善网络拥塞时的传输性能。
tcpip实验报告

实验一Linux内核通用链表的使用一、实验目的学习Linux内核通用链表的设计原理,熟练掌握Linux内核通用链表的使用。
二、实验内容1、掌握Linux通用链表的创建2、掌握通用链表添加元素、删除元素和遍历链表的方法3、掌握通用链表的查找方法三、实现原理Linux的内核源文件list.h提供了所有的链表定义,以及各类链表的操作接口和实现。
其中创建链表的方法如下:LIST_HEAD(my_list);在指定的head后插入新节点,常用于堆栈数据结构的实现list_add(structlist_head *new, structlist_head *head);在指定的head前插入新节点,常用于队列数据结构的实现list_add_tail(structlist_head *new, structlist_head *head);从链表中删除一个指定节点list_del(structlist_head *entry);根据当前链表节点指针ptr获得宿主节点指针list_entry(ptr, type, member);遍历链表list_for_each(pos, head);四、实现代码和运行结果#include <stdio.h>#include <malloc.h>#include "list.h"struct user{int id;structlist_head list;};int main(void){struct user *p;LIST_HEAD(user_queue);for (inti = 0; i< 10; i++){p = (struct user *)malloc(sizeof(struct user));p->id = i;list_add_tail(&p->list, &user_queue);}structlist_head *q;list_for_each(q, &user_queue){p = list_entry(q, struct user, list);printf("%d\n", p->id);}return 0;}#include <stdio.h>#include <malloc.h>#include "list.h"struct user{char username[20];int id;structlist_head list;};int main(void){struct user *p;LIST_HEAD(head);for (inti; i< 10; i++){p = (struct user *)malloc(sizeof(struct user)); p->id = i + 1;printf("user %2d, Please input username: ", i+1); scanf("%s", p->username);list_add_tail(&(p->list), &head);}structlist_head *tmp;list_for_each(tmp, &head){p = list_entry(tmp, struct user, list);printf("%d\t%s\n", p->id, p->username);}list_for_each(tmp, &head){p = list_entry(tmp, struct user, list);if (p->id == 5)printf("%s\n", p->username);}return 0;}实验二Linux内核通用哈希链表的使用一、实验目的学习Linux内核通用哈希链表的设计原理,熟练掌握Linux内核通用哈希链表的使用。
实验四 TCPIP

实习四实验报告一、实习目的1.了解网络基本配置中包含的协议、服务、客户端,以及基本参数,并了解各种协议的作用,以及安装方法;2.掌握Windows支持的网络协议及参数设置方法;3.练习并掌握简单网络命令的使用。
二、实习内容1.查看所在机器的主机名称和网络属性,包括网络基本配置中包含的协议、服务、客户端,以及有关的基本参数;2.修改网络配置参数,建立小组内的局域网;3.网络协议、服务、客户端等组件的安装和卸载方法;4.常用网络命令的使用。
三、实习步骤1. 常用网络命令的使用(1)IPConfig●命令 ipconfig/all ,显示的信息如下:Windows IP ConfigurationHost Name . . . . . . . . . . . . :Primary Dns Suffix . . . . . . . :Node Type . . . . . . . . . . . . :IP Routing Enabled. . . . . . . . :WINS Proxy Enabled. . . . . . . . :Ethernet adapter 本地连接:Connection-specific DNS Suffix . :Description . . . . : 3Com 3C920 Integrated Fast EthernetController (3C905C-TX Compatible)Physical Address. . . . . . . . . :Dhcp Enabled. . . . . . . . . . . :IP Address. . . . . . . . . . . . :Subnet Mask . . . . . . . . . . . :Default Gateway . . . . . . . . . :DNS Servers . . . . . . . . . . . :(2) ping●在命令行下键入:Ping 127.0.0.1,显示以下信息:●在命令行下键入:Ping 本机IP地址,显示信息如下:说明网络配置正常。
TCP-IP攻击实验-实验报告.docx

中南大学TCP/IP 攻击实验实验报告学生姓名学院信息科学与工程学院专业班级完成时间2015年 11 月 29 日目录1. 实验描述 (3)2. 实验步骤 (3)环境搭建 (3)实验 1:ARP缓存中毒 (3)实验 2:ICMP重定向攻击 . (4)实验 3:SYN洪流攻击 (5)实验 4:在 telnet和ssh连接上的TCP RST攻击 (6)实验5:对视频流应用程序的TCP RST 攻击 (7)实验 6:ICMP 盲目连接重置和源端关闭攻击 (7)实验 7:TCP报文劫持 (8)3. 总结 (8)TCP/IP 攻击实验1.实验描述【实验背景】由于 TCP/IP 协议是 Internet的基础协议,所以对TCP/IP 协议的完善和改进是非常必要的。
TCP/IP 协议从开始设计时候并没有考虑到现在网络上如此多的威胁, 由此导致了许多形形色色的攻击方法,一般如果是针对协议原理的攻击( 尤其 DDOS),我们将无能为力。
TCP/IP 攻击的常用原理有:(1)源地址欺骗(Source Address Spoofing)Spoofing);、 IP欺骗 (IP Spoofing)和 DNS欺骗 (DNS(2)路由选择信息协议攻击 (RIP Attacks) ;(3) 源路由选择欺骗(Source Routing Spoofing);(4) TCP 序列号欺骗和攻击(TCP Sequence Number Spoofing and Attack)。
【实验目的】基于 TCP/IP 协议进行攻击实验, 了解 TCP/IP 协议的具体机制。
2.实验步骤环境搭建这里我使用三台虚拟机做实验,其中一个用于攻击;另一个用于被攻击;第三个作为观察者使用;把三台主机放在同一个LAN中,其配置信息参照如下所示(实际在实验过程中有所改动):这里我使用的是Wireshark工具箱的SEED实验室已经搭建好,并且已经安装好相关的Ubuntu 系统,与此同时三台虚拟机都需要打开netwoxFTP 和 Telnet工具箱和服务:使用如下命令来完成上述任务Start the ftp server#servicevsftpd startStart the telnet server#serviceopenbsd-inetd start实验 1:ARP缓存中毒【实验背景】ARP缓存是 ARP协议的重要的一部分。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络协议分析实验一、实验目的通过使用协议分析软件,对通信系统的通信过程进行监控、分析,以了解通信协议的工作过程。
二、实验内容利用协议分析软件(如:Wireshark)跟踪局域网报文(如条件允许也可跟踪多种局域网协议报文),实验内容如下:将安装协议分析软件的PC接入以太网中,跟踪PC之间的报文,并存入文件以备重新查。
设置过滤器过滤网络报文以检测特定数据流。
利用协议分析软件的统计工具显示网络报文的各种统计信息。
三、实验步骤1、在PC中安装协议分析软件(如:Wireshark)。
具体安装过程详见附录:Wireshark用户指南。
2、启动Wireshark协议分析软件,选择抓包菜单项启动实时监视器,开始实时跟踪显示网络数据报文。
可根据系统提示修改显示方式,详见附录:Wireshark用户指南。
3、调出跟踪存储的历史报文,选择有代表性的ETHERNET,IEEE802.3,IP,ICMP,TCP,UDP报文,对照有关协议逐个分析报文各字段的含义及内容。
EHERNET报文格式IEEE802.3报文格式IP报文格式4、设置过滤器属性,如目的地址,源地址,协议类型等。
如过滤不需要的网络报文,过滤器允许设置第二层,第三层或第四层的协议字段。
过滤器有两种工作方式:1)捕获前过滤:协议分析软件用过滤器匹配网络上的数据报文,仅当匹配通过时才捕获报文。
2)捕获后过滤:协议分析软件捕获所有报文,但仅显示匹配符合过滤条件的报文。
选择统计菜单项可以显示网络中各种流量的统计信息,如:关于字节数,广播中报文数,出错数等。
UDP 客户/服务器实验一、实验目的本实验目的是使用因特网提供的UDP 传输协议,实现一个简单的UDP 客户/服务器程序,以了解传输层所提供的UDP 服务的特点,应用层和传输层之间的软件接口风格,熟悉socket 机制和UDP 客户端/服务器方式程序的结构。
二、实验内容本实验为UDP 客户/服务器实验。
实验内容:UDP echo 客户/服务器程序的设计与实现。
UDP echo 客户/服务器程序完成以下功能:客户从标准输入读一行文本,写到服务器上;服务器从网络输入读取此行,并回射(echo )给客户;客户读此回射行,并将其写到标准输出。
三、实验步骤1、 总体设计客户程序从标准输入读一行文本,写到服务器程序上;服务器程序从网络输入读取此行,并回射给客户程序;客户程序读此回射行,并将其写到标准输出。
2、 详细设计UD P 客户-服务器程序所用套接口函数1)服务器main 函数2)服务器str_echo 函数3)客户main函数4)客户str_echo函数#include <netinet/in.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#define MAXLINE 4096#define LISTENQ 1024 /* 2nd argument to listen() */ #define SERV_PORT 9877#define SA struct sockaddrstatic int sockfd;void dg_echo(int, SA *, socklen_t);intmain(int argc, char ** argv){struct sockaddr_in servaddr, cliaddr;if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0) {printf("socket error.\n");exit(1);}bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);bind(sockfd, (SA *)&servaddr, sizeof(servaddr));dg_echo(sockfd, (SA *)&cliaddr, sizeof(cliaddr));}voiddg_echo(int sockfd, SA *pcliaddr, socklen_t clilen){int n;socklen_t len;char mesg[MAXLINE];for ( ; ; ) {len = clilen;n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);sendto(sockfd, mesg, n, 0, pcliaddr, len);}}Cli#include <netinet/in.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#define MAXLINE 4096#define LISTENQ 1024 /* 2nd argument to listen() */ #define SERV_PORT 9877#define SA struct sockaddrvoid dg_cli(FILE *, int, const SA *, socklen_t);main(int argc, char **argv){int sockfd;struct sockaddr_in servaddr;if (argc != 2) {printf("usage:udpcli01sigio <IPaddress>\n");exit(1);}bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);inet_pton(AF_INET, argv[1], &servaddr.sin_addr);if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0) {printf("socket error.\n");exit(1);}dg_cli(stdin, sockfd, (SA *)&servaddr, sizeof(servaddr));exit(0);}dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen){int n;char sendline[MAXLINE], recvline[MAXLINE + 1];while (fgets(sendline, MAXLINE,fp) != NULL) {sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);recvline[n] = 0; /* null terminate */fputs(recvline, stdout);}}TCP客户/服务器实验四、实验目的本实验目的是使用因特网提供的TCP传输协议,实现一个简单的TCP客户/服务器程序,以了解传输层所提供的TCP服务的特点,应用层和传输层之间的软件接口风格,熟悉socket 机制和TCP客户端/服务器方式程序的结构。
五、实验内容本实验为TCP客户/服务器实验。
实验内容:TCP echo客户/服务器设计与实现。
TCP echo 客户/服务器程序完成以下功能:客户从标准输入读一行文本,写到服务器上;服务器从网络输入读取此行,并回射(echo)给客户;客户读此回射行,并将其写到标准输出。
六、实验步骤1、 总体设计客户程序从标准输入读一行文本,写到服务器程序上;服务器程序从网络输入读取此行,并回射给客户程序;客户程序读此回射行,并将其写到标准输出。
2、 详细设计T C P 客户-服务器程序所用套接口函数1)服务器main 函数2)服务器str_echo 函数3)客户main函数4)客户str_echo函数Serv#include <netinet/in.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#define MAXLINE 4096#define LISTENQ 1024 /* 2nd argument to listen() */ #define SERV_PORT 9877#define SA struct sockaddrvoid str_echo(int);ssize_t readline(int, void *, size_t);static ssize_t my_read(int, char *);intmain(int argc, char **argv){int listenfd, connfd;pid_t childpid;socklen_t clilen;struct sockaddr_in cliaddr,servaddr;if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("socket error.\n");exit(1);}bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);if (bind(listenfd, (SA *)&servaddr, sizeof(servaddr)) < 0) {printf("bind error.\n");exit(1);}if (listen(listenfd,LISTENQ) < 0) {printf("listen error.\n");exit(1);}for( ; ;) {clilen = sizeof(cliaddr);if ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) { printf("accept error.\n");exit(1);}if((childpid = fork()) == 0) {close(listenfd) ;str_echo(connfd);exit(0);}close(connfd);}}voidstr_echo(int sockfd){ssize_t n;char line[MAXLINE];for ( ; ; ) {if ( (n = readline(sockfd, line, MAXLINE)) == 0)return; /* connection closed by other end */write(sockfd, line, n);}}/*end str_echo*/ssize_treadline(int fd, void *vptr, size_t maxlen){int n, rc;char c, *ptr;ptr = vptr;for (n = 1; n < maxlen; n++) {if ( (rc = my_read(fd, &c)) == 1) {*ptr++ = c;if (c == '\n')break; /* newline is stored, like fgets() */} else if (rc == 0) {if (n == 1)return(0); /* EOF, no data read */elsebreak; /* EOF, some data was read */ } elsereturn(-1); /* error, errno set by read() */ }*ptr = 0; /* null terminate like fgets() */return(n);}/* end readline */static ssize_tmy_read(int fd, char *ptr){static int read_cnt = 0;static char *read_ptr;static char read_buf[MAXLINE];if (read_cnt <= 0) {again:if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {if (errno == EINTR)goto again;return(-1);} else if (read_cnt == 0)return(0);read_ptr = read_buf;}read_cnt--;*ptr = *read_ptr++;return(1);}/*end ssize_t*/Cli#include <netinet/in.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#define MAXLINE 4096#define LISTENQ 1024 /* 2nd argument to listen() */ #define SERV_PORT 9877#define SA struct sockaddrvoid str_cli(FILE *,int);ssize_t readline(int, void *, size_t);static ssize_t my_read(int, char *);intmain(int argc, char **argv){int sockfd;struct sockaddr_in servaddr;if (argc != 2) {printf("usage:tcpcli01 <IPaddress>");exit(1);}if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("socket error.\n");exit(1);}bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);inet_pton(AF_INET, argv[1], &servaddr.sin_addr);if (connect(sockfd, (SA *)&servaddr, sizeof(servaddr)) < 0) { printf("connect error.\n");exit(1);}str_cli(stdin, sockfd);exit(0);}voidstr_cli(FILE *fp,int sockfd){char sendline[MAXLINE], recvline[MAXLINE];while (fgets(sendline,MAXLINE, fp) != NULL) {write(sockfd, sendline, strlen(sendline));if (readline(sockfd, recvline, MAXLINE) == 0) {printf("str_cli:server terminated prematurely.\n");exit(1);}fputs(recvline, stdout);}}/*end str_cli */ssize_treadline(int fd, void *vptr, size_t maxlen){int n, rc;char c, *ptr;ptr = vptr;for (n = 1; n < maxlen; n++) {if ( (rc = my_read(fd, &c)) == 1) {*ptr++ = c;if (c == '\n')break; /* newline is stored, like fgets() */} else if (rc == 0) {if (n == 1)return(0); /* EOF, no data read */elsebreak; /* EOF, some data was read */} elsereturn(-1); /* error, errno set by read() */ }*ptr = 0; /* null terminate like fgets() */return(n);}/* end readline */static ssize_tmy_read(int fd, char *ptr){static int read_cnt = 0;static char *read_ptr;static char read_buf[MAXLINE];if (read_cnt <= 0) {again:if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {if (errno == EINTR)goto again;return(-1);} else if (read_cnt == 0)return(0);read_ptr = read_buf;}read_cnt--;*ptr = *read_ptr++;return(1);}/*end ssize_t*/总结:实验对于我们来说是很重要的,经过这几次实验,我已经大致了解了TCP/IP的工作原理,知道了要想实验客户机和服务器的连连通,具体的步骤是什么。