1、计算机网络课程设计实验报告计算机网络课程设计报告姓 名: 学 号:班 级: 指导老师: 湖南科技大学计算机科学与工程学院2013年6月实验一1.实验名称:网络聊天程序的设计与实现2.实验目的:通过本实验能够了解socket通信的原理并在此基础上编写一个聊天程序了解TCP/IP的基础知识,发现TCP与UDP的优缺点以及在网络通信的应用。3。实验原理:从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络的边缘部分中的两个主机使用网络的两个主机使用网络的核心部分进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路
2、由器在转发分组时都只用到下三层的功能.从IP层来说,通信的两端是两个主机,IP数据报的首部明确的标志了这两个主机的IP地址。但是严格的讲,两个主机进行通信就是两个主机中的应用进程互相通信.根据应用程序的不同需求,运输层需要有两种不同的运输协议,即是面向连接的TCP和无连接的UDP。在使用这两个协议时运输层向高层用户屏蔽了下面的网络核心的细节,它使应用进程看见的就是好像在两个运输层实体间有一条端到端的逻辑通信信道,但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别。当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于一条全双工的可靠信道.但当
3、运输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道。由于我在课程设计中采用的是UDP协议进行通信的,这里就只简述一下一些关于UDP的内容,UDP在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP报文后,不需要给出任何确认.虽然UDP不提供可靠的交付,但在某些情况下UDP却是一种最有效的工作方式。为此当我们使用UTP协议使两个计算机中的进程要互相通信,不仅必需知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。我们的计算机通信时采用客户服务器方式。客户在发起通信请求时,必需先知道对方的服务器的IP地址和端口号,因此通
4、过IP地址和端口号我们就能将两台主机连接起来,然后通过输入输出流将信息发送到对方的主机上。这样就能实现网络的聊天程序.4。.流程图:5.实验步骤:通过使用原理我们知道若要实现两主机间的通信最重要的是获得对方的IP地址和设置端口号,在实验中我们假定已经知道了要通信主机的IP地址,故在编程中主要的是套接字socke的编程步骤,在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。服务器编程步骤:1、加载数据库,创建套接字(WSAStrartup()/socket());2、绑定套接字到一个IP地址和一个端口上(bind());3、将套接字设置为监听模式等待请求(list
5、en());4、请求到来后,接受链接请求,返回一个新的对应于此次连接的套接字(accept());5、用返回的套接字和客户端进行通信(send()/rec();6、返回,等待另一个请求;7、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup().其次是客户端的编程步骤:1、加载数据库,创建套接字(WSAStrartup()/socket();2、向服务器发送连接请求(connect();3、和服务器端进行通信(send()/recv());4、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup()。6。实验过程中的问题:首先是在编写代
6、码时考虑了是用TCP还是用UDP协议,通过翻看了原来计算机网络的书后举得利用TCP来编写聊天程序的话,由于TCP协议相对于UDP协议复杂了许多且是面向连接的运输层协议 在每次建立与断开连接的时候都要不停的进行确认十分占用网络资源 ,但UDP就不用那么繁琐,且效率相对的要高出许多。但是在代码测试时老师说到作为一个聊天工具重点是信息的交流对于UDP很容易出现丢包的现象,且TCP协议具有很高的可靠性,对于网络的占用也并非想象中的那么严重,故对于编写此类程序还是用TCP的好一些.其次是在编程过程中发现在通信过程中由于端口号只设定一个所以一旦服务器与一台客户端连接时,其他的的客户端就不能与服务器进行连接
7、了,因为先前的客户端占用的端口号。通过与老师的交流后知道了,在使用TCPUDP协议时有两条连接时,突然就有种豁然开朗的感觉.实验二:1。实验名称:Ping程序上设计与实现2.实验要求:用C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试-个主机到只一个主机之间的连通情况。要求: 1)独立完成程序的设计、编码和调试。2)系统利用C语言实现,程序调试环境为Turbo C或VC;3)按照课程设计规范书写课程设计报告。4)采用VC环境进行调试运行。3.实验内容本程序主要分为四个模块(功能模块图见图1。1):初始化模块,功能控制模块,数据报解读模块,Ping测试模块
8、。初始化模块:该模块用于定义及初始化各个全局变量,为winsock加载winsock体.功能控制模块:该模块是被其他模块调用,其功能包括解析参数、计算ICMP数据报文检验和、清除SOCKET,ICMP包数据以及接受缓冲区。数据报解读模块:数据报解析模块提供了解读IP选项和解读ICMP报文的功能。Ping测试模块:该模块是本程序的核心模块,调用其他模块实现其功能,进而实现Ping的功能。4.流程图:5。实验中遇到的问题及解决方案:问题1:提示库函数名为未标示符?分析:在程序开头只有以下头文件,#include #include stdio.h#include h_addr_list0; /IPa
9、ddr_in.sin_family = AF_INET;addr_in。sin_port = htons(57274);/ 把原始套接字sock 绑定到本地网卡地址上bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in);/ dwValue为输入输出参数,为1时执行,0时取消DWORD dwValue = 1;/ 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL/ 的定义为: define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)ioctlsocket(sock, SIO_RCVALL
10、, dwValue);前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以了。3. IP数据报头的结构体:struct ipheader unsigned char ip_hl:4; /header length(报头长度)/ unsigned char ip_v:4; /version(版本)*/ unsigned char ip_tos; /*type os service服务类型/ unsigned short int ip_len; /total length (总长度)/ unsigned short int ip_id; /*identi
11、fication (标识符)*/ unsigned short int ip_off; /*fragment offset field(段移位域)*/ unsigned char ip_ttl; /*time to live (生存时间)/ unsigned char ip_p; /*protocol(协议)*/ unsigned short int ip_sum; /checksum(校验和)*/ unsigned int ip_src; /source address(源地址)/ unsigned int ip_dst; /destination address(目的地址)*/ / tot
12、al ip header length: 20 bytes (=160 bits) /4.TCP报头结构体:typedef struct tcpheader unsigned short int sport; /*source port (源端口号)*/ unsigned short int dport; /destination port(目的端口号)*/ unsigned int th_seq; /sequence number(包的序列号)/ unsigned int th_ack; /acknowledgement number(确认应答号)/ unsigned char th_x:4
13、; /unused(未使用)/ unsigned char th_off:4; /data offset(数据偏移量)/ unsigned char Flags; /标志全/ unsigned short int th_win; /windows(窗口)*/ unsigned short int th_sum; /checksum(校验和)/ unsigned short int th_urp; /urgent pointer(紧急指针)*/TCP_HDR;5.UDP报头结构体:typedef struct udphdr unsigned short sport; /source port(源
14、端口号)*/ unsigned short dport; /*destination port(目的端口号)*/ unsigned short len; /udp length(udp长度)*/ unsigned short cksum; /udp checksum(udp校验和)*/UDP_HDR;。变量SOCKET sock; /进行网络通信的套接字/ SOCKET socket( int af, int type, int protocol );应用程序调用socket函数来创建一个能够进行网络通信的套接字.第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置A
15、F_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第三个参数指定应用程序所使用的通信协议.该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。套接字描述符是一个整数类型的值.每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统
16、的内核缓冲里。 WSADATA wsd;存储被WSAstartup函数调用后返回的Windowssockets数据 ,即存放windows socket初始化信息 DWORD dwBytesRet; 32bit的无符号整数 unsigned int optval = 1; unsigned char dataudp,*datatcp; int i,pCount=0,lentcp, lenudp; SOCKADDR_IN sa,saSource, saDest;用来指定ip地址和端口信息 struct hostent FAR * pHostent;主机指针 char FAR nameMAX_HO
17、STNAME_LAN; char szSourceIPMAX_ADDR_LEN, szDestIPMAX_ADDR_LEN,RecvBuf65535 = 0; struct udphdr pUdpheader; struct ipheader pIpheader; struct tcpheader pTcpheader; WSAStartup(MAKEWORD(2,1),&wsd); MAKEWORD(2,1)创建一个被指针变量连接而成的word变量。过滤规则:if (sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)=SOCKET_ERROR) exit(1);gethostname(name, MAX_HOSTNAME_LAN);pHostent = gethostbyname(name);sa。sin_family = AF_INET;sa。sin_port = htons(6000);memcpy(&sa。sin_addr.S_un。S_addr, pHostenth_addr_list0, pHostent-h_length);bind(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1