网络编程实现网络对时课程设计

网络编程实现网络对时课程设计
网络编程实现网络对时课程设计

课题名称:TCP/IP协议及网络编程技术课程设计子课题:实现网络对时程序

院(系):计算机学院

专业:通信工程

班级:

学生姓名:hshengxue

学号:

指导教师:周坚和

2012年 6 月22 日

目录

摘要 (3)

引言 (3)

一、课程设计的目的和意义 (3)

二、课程设计的内容和要求 (3)

三、课程设计所需了解的相关内容和技术 (4)

(一)、套接口 (4)

(1)套接口的概念 (4)

(2)套接口的分类 (5)

(3) Socket工作模式 (6)

(二)、所用的关键技术 (6)

(三)Winsock API的使用 (7)

四、课程设计过程 (7)

(一)设计思路 (7)

(1)服务器的主要工作流程 (7)

(2)客户机的工作流程.............................................8. (3)服务器的工作流程 (8)

五、编程实现 (9)

(一)服务器端的实现 (9)

(二)客户端的实现 (11)

六、小结 (15)

七、参考文献 (16)

摘要:

网络应用程序是通过网络使用通信协议实现进程间的通信;本项目采用软件工程的方法,综合运用网络程序设计,以visual c++6.0作为系统前台应用程序开发工具。此局域网聊天工具采用客户端/服务端(C/S)模式和UDP连接。它由两个程序组成:服务器(Server)和客户端(Client),首先需要登录服务器,再登录客户端,需要指定服务器IP地址以便与服务器建立连接。登录后,客户可以在自己的界面上与另一指的定的客户端进行聊天。服务器模块主要用来维护网络用户用户的信息,包括用户IP地址,聊天内容;聊天客户端模块主要包括用户连接,发送信息,接收信息。是一套用于Internet网络使用的网络聊天工具,其操作简单,灵活性好,运用也比较稳定。

关键词:网络,聊天程序,客户端/服务端,UDP传输控制协议。

0、引言

网络应用程序是通过网络使用通信协议实现进程间的通信,UDP 是TCP/IP协议族为传输层设计的两个协议之一,UDP提供的是无连接、不可靠的网络传输协议,在进行网络应用程序设计时,TCP/IP 协议的核心内容被封装在操作系统中。网络应用程序要使用UDP协议来实现自己的功能,只能通过由系统提供给用户的UDP协议编程接口来实现。因此,可以说设计网络应用程序就是利用网络编程接口(API)进行程序设计的过程。在Windows环境下的网络应用程序编程接口叫Windows Sockets,即套接口。

一、课程设计的目的和意义

UDP是TCP/IP协议族为传输层设计的两个协议之一,它在进程与进程的通信过程中,提供了有限的差错校验功能,是一种无连接的,不可靠的协议。UDP在一个较低的水平上完成进程之间的通信,在收到分组的时候没有流量控制机制也没有确认机制,适用于可靠性比较高的局域网。由于UDP采取了无连接的方式,因此协议简单,在一些特定的应用中协议运行效率高。UDP适合一些实时的应用,如IP电话,视频会议,它们要求源主机以恒定的速率发送数据,并且在网络出现拥塞时,可以丢失一些数据,但是延迟不能太大。基于这些特点,流式多媒体通信、多播等应用在传输层采用的就是UDP协议。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。

二、课程设计的内容和要求

用socket 编程接口编写两个程序,分别为客户机程序(client.cpp)和服务器程序(server.cpp),使用UDP传输层协议,能实现下述功能:客户端能够从服务器端取出标准时间,然后同步本机时钟。

三、课程设计所需了解的相关内容和技术

(一)、套接口

(1)套接口的概念

WindowsSockets API 依靠套接口Socket进行通信。套接口可看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网路应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡(NIC)的传输介质将这段信息发送到另一台主机的Socket中,使这段信息能传送到其它程序中,如图1所示。[1]

当主机A上的网络应用程序A要发送数据时,通过调用数据发送函数首先将要发送的一段信息写入Socket中,Socket中的内容通过主机A的网络管理软件由主机A的网络接口卡发送到主机B,主机B的网络接口卡接收到这段信息后,再传给主机B的网络管理软件,网络管理软件将这段信息保存在主机B的Socket中,然后程序B才能在Socket中读取并使用这段信息。由此看来,Socket的本质是通信过程中所要使用的一些缓冲区及一些相关的数据结构。

(2)套接口的分类

为了满足不同的通信程序对通信质量和性能的要求,一般的网

络系统提供了三种不同类型的套接口,以供用户在设计网络应用程序时根据不同的要求来选择。这三种套接口分别是:

(1)流式套接口(SOCK_STREAM),它提供了一种可靠的、面向连接的双向数据传输服务,实现数据无差错、无重复地发送。流失套接口内设流量控制,被传输的数据看作是无记录边界的字节流。在TCP/IP 协议族中,使用TCP协议来实现字节流的传输,当用户想要发送大批量的数据或者对数据的传输有较高的要求时,使用流式套接口。(2)数据报套接口(SOCK_DGRAM),它提供了一种无连接、不可靠的双向数据传输服务。免费论文。数据包以独立的包形式被发送,并保留了记录边界,不提供可靠性保证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端数据按发送顺序接收。免费论文。在TCP/IP协议族中,使用UDP协议来实现数据报套接口。在同一台计算机上或负载较轻的LAN上,因为出现差错的可能性较小,所以可以使用数据报套接口进行数据传输,这样通信的质量可以得到保证,并且通信的效率较高。

(3)原始套接口(SOCK_RAW),该套接口允许对较低层协议(如IP 或ICMP)进行直接访问,常用于检验新的网络协议实现,也可用于测试新配置或安装的网络设备。

(3) Socket工作模式

Socket以客户/服务器模式工作。Socket服务器程序通常事先已经启动,并在一个众所周知的端口监听对服务的请求。Socket客户

应用程序需要某种服务时,便向提供服务的Socket服务器发出请求,服务器接收到请求后,就响应客户提出的请求。

(二)、所用的关键技术

(1)UDP协议

UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。(2)TCP/IP协议

在T C P / I P协议族中,有两个互不相同的传输协议: T C P(传输控制协议)和U D P(用户数据报协议)。T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面, U D P则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。TCP/IP协议与Winsock网络编程接口Winsock规范不是一种网络协议,而是一套开放的、支持多种协议的Windows写的网络编程接口。Winsock可以访问很多种网络协议,可

以把它当作一种协议的封装。现在的Winsock已经基本上实现了与协议无关,可以使用Winsock来调用协议的功能

(3)Winsock API的使用

下面使用Winsock进行编程时涉及的主要函数:

WSAStartup函数、WSACleanup函数、socket函数、closesocket函数、send(sendto)函数、recv(recvfrom)函数、bind函数、listen 函数、accept函数、connect函数

四、课程设计过程

(一)设计思路

设计UDP服务器的过程如下所示。首先,创建又一个Socket并监听。然后启动线程接收数据。用一个链表保存所有连上的客户,并通知连接成功。这样,客户就有机会处理这一事件并作一些动作。最后,当客户断开时,向服务器发送一个事件,服务器就可以做一些收尾工作。其中最关键的部分是收发部分和数据处理部分。

(1)服务器的主要工作流程如图1所示:

(2)客户机的工作流程如下:

打开通信信道(申请一个套接字),并连接到服务器在主机的保留端口,该端口对应服务器的UDP进程。向服务器发出请求报文,等待接收应答。从服务器方收到最终应答结果,或在不再请求时关闭信道并终止客户机进程。

(3)服务器的工作流程如下:

打开通信信道(申请一个套接字),通知本地主机在某一保留端口接收客户机请求。等待客户机请求到达指定端口。接收到请求,启动一个新进程处理用户请求,同时释放旧进程以响应新的客户请求,一旦服务完成,关闭新进程与客户的通信链路。继续等待客户机请求。如果

不想响应客户机请求,关闭服务器进程。

五、编程实现

本实例使用了Visual C++6.0下的控制台程序,该程序中的通信协议使用的是面向连接的TCP协议(SOCK_STREAM)[3]。服务器端的IP 地址使用系统指定的IP地址,端口号在程序中指定为6000。

(一)UDP服务器端的实现

建立一个空的基于控制台的应用程序 server,

本设计实现了基于UDP协议的客户端和服务器端的一个简单聊天程序设计。

服务器主要源代码如下:

首先project→setting→link→project Options中subsystem:window改为subsystem:console

#include

#include

#include

#include

#pragma comment( lib, "ws2_32.lib" )

void main()

{

WSADATA wsadata;

WSAStartup(MAKEWORD(2,2), &wsadata);//初始化Windows Sockets

DLL

SOCKET sock;

sock = socket(AF_INET, SOCK_DGRAM, 0);//创建sock,SOCKE_DGRAM 表示套接口类型UDP

struct sockaddr_in local;//本地主机地址变量

struct sockaddr_in from;//远程主机地址变量

int fromlen =sizeof(from);

local.sin_family=AF_INET;//该处告诉Winsock所使用的是IP地址族

local.sin_port=htons(8000); //监听端口

local.sin_addr.s_addr=INADDR_ANY; //本机

bind(sock,(struct sockaddr*)&local,sizeof(local));//bind()函数把一个sock与一个主机地址和端口号联系起来

while (1)

{

char buffer1[1024];

char buffer2[1024];

printf("等待来自于其他机器的消息-------------\n");

if(recvfrom(sock,buffer1,sizeof(buffer1),0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR)//获得客户端的主机地址信息

{

printf("接受到来自于 %s--%s\n",inet_ntoa(from.sin_addr),buffer1);

//给cilent发信息

printf("请输入你给客户端的消息:\n");

scanf("%s",buffer2);

sendto(sock,buffer2,sizeof (buffer2),0,(struct sockaddr*)&from,fromlen); //调用sendto()向客户端发送应答数据

}

Sleep(500);

}

closesocket(sock);//关闭sock

}

(二)UDP客户端的实现

建立一个空的基于控制台的应用程序client:

客户端主要源代码如下:

首先project→setting→link→project Options中subsystem:window改为subsystem:console

// 321.cpp : Defines the entry point for the application.

//

#include "afx.h"

#include

#include

#include

#pragma comment(lib,"WS2_32.lib")

main()

{

WSADATA wsd;

SOCKET s;

char buf[1024];

if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) {

return -1;//失败

}

s=socket(AF_INET,SOCK_DGRAM,0);

if(s==INVALID_SOCKET)

{

WSACleanup();

return -1;//创建套接字失败

}

SOCKADDR_IN servAddr;

servAddr.sin_family=AF_INET;

servAddr.sin_addr.s_addr=inet_addr("172.17.136.243"); servAddr.sin_port=htons(2000);

if(bind(s,(SOCKADDR*)&servAddr,sizeof(SOCKADDR_IN))==SOCKET _ERROR)

{

closesocket(s);

WSACleanup();

return -1;//绑定套接字失败

}

int nServAddrlen=sizeof(servAddr);

ZeroMemory(buf,sizeof(buf));

CString ss="TimeNow";

strcpy(buf,ss);

SOCKADDR_IN clientAddr;

clientAddr.sin_family=AF_INET;

clientAddr.sin_addr.s_addr=inet_addr("172.17.136.243"); clientAddr.sin_port=htons((short)5000);

int nClientlen=sizeof(clientAddr);

if(sendto(s,buf,sizeof(buf),0,(SOCKADDR*)&clientAddr,nClien tlen)==SOCKET_ERROR)

{

closesocket(s);

WSACleanup();

return -1;//向服务器发送数据失败

}

memset(buf,0,1024);

if(recvfrom(s,buf,sizeof(buf),0,(SOCKADDR*)&servAddr,&nServ Addrlen)==SOCKET_ERROR)

{

closesocket(s);

WSACleanup();

return -1;//接收数据失败

}

SYSTEMTIME systime;

memcpy(&systime,buf,16);

SetLocalTime(&systime);//设置本地与服务器时间同步。closesocket(s);

WSACleanup();

}(三)、运行截图如下:

运行客服端:

图1

运行服务器端:

图2

六、小结

本次课程设计为时二周,我选的课题是实现简化功能的客户机和服务器聊天程序(运用UDP实现),其主要研究内容在于实现文件的传输及接收。我们首先是了解UDP的定义,即确定UDP究竟是个什么协议,它有些什么性质和特征,它应用于那些方面。经过了解知道了UDP是TCP/IP协议族为传输层设计的两个协议之一,它在进程与进程的通信过程中,提供了有限的差错校验功能,是一种无连接的、不可靠的协议。分析知道了UDP其实就是用来实现网络中文件的传输和接收的协议。接下来我就开始思考具体的UDP实现的程序,该程序分

为客户端和服务器端两部分,客户端主要是执行文件或消息的发送,服务器端则主要是接收这些内容。整个程序最重要也是最有难度的部分就是如何把发送和接收两部分联系在一起,经过我反复翻阅资料和与同学交流,我们终于攻克了这个难题,这样我们就把程序的功能尽可能的实现出来。而且这次的课程设计过程中,我们接触到了很多关于Winsock的编程,使我们学到了新知识。具体的,通过这次的课程设计,我们掌握了:UDP套接字的创建、绑定和关闭;UDP数据报的发送和接收方法等。通过几个星期的努力,虽然从中也发现了自己很多不足,可能其中还有不少问题,但我觉得最重要的是自己也从中得到很多;不敢说百分百的完成也应该基本上完成了课题任务,成功地实现课题目标。

七、参考文献

[1]任泰明.TCP/IP协议与网络编程[M].第1版.西安:西安电子科技大学出版社.2004

[2]邹月,陈建兵.Socket的网络编程研究与实现[J].电脑编程技巧与维护.2008

[3]罗军舟,黎波涛,杨明. TCP/IP协议及网络编程技术北京:清华大学出版社,2004

相关主题
相关文档
最新文档