基于TCP的网络通信协议设计毕业论文 下载本文

西安工程大学学士学位论文

(1)fun功能标识定义为枚举类型(enum),占4个byte。用它来声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型,在win32机器上,枚举类型所占字节数总是4byte,在上面代码片段中sizeof(enum),;sizeof(FUN),sizeof(LOGIN)都是4byte。

(2)Fun分别包括LOGIN,LOGOUT,LOGOK,LOGERR,SHAKE,TRANSMIT,SVRSTOP,ERRL。lLOGIN表示用户登录,

LOGOUT表示用户退出,LOGOK表示用户登陆成功,LOGERR表示用户登陆失败,SHAKE表示震动,TRANSNIT表示信息传输,SRRSTOP表示服务器停止,ERR表示数据传送出错。 (2) senderID是发送者的标识,用以标记信息的来源ID;

(3) RecerverID是接收者的标识,用以标记信息的目的ID; (4) Connect是要传输的数据;

(5) Len记录了传输数据的长度,用于在服务器端进行简单校验,如果出错,则提醒发送者传输错误,同时直接丢弃接受到的错误数据,否则转发数据给接收者;

5.3 软件工作模式图

5.4 软件设计原理

5.4.1 协议工作编程原理

(1) 创建CSocket对象,创建两个CSocket对象,分别为服务器端和客户端的对象,如图:

CSocket ServerSocket; CSocket ClientSocket;

12

西安工程大学学士学位论文

(2)使用CSocket对象的Create()函数来创建Windows Socket。同时,Create()函数会自行调用Bind()函数将此Scoket绑定到指定的地址上面。例如: ServerSocket.Create(5000); //服务器端需要指定一个端口号 ClientSocket.create(); //客户端不用指定端口号

(3)对于服务器端,需要这个Socket不停地监听是否有来自于网络上的链接请求,因此需要调用监听函数。例如: ServerSocket.listen();

(4)对于客户端,实行连接,例如:

ClientSocket.Connect(CString Address,Unsinged int Port);//Address服务器的地址,Port是端口号

(5)服务器接受链接。在服务器端用Accept接收俩字客户端的消息。而此时服务器端还需建立一个新的CSocket兑现,用来和客户端进行交流。例如: CSocket Receive;

ServerSocket.Accept(Receive);

(6)客户端发送消息,例如: ClientSocket.Send( string ,buf );

(7)服务器接收客户端送来的消息: ServerSocket.Receive( string ,buf );

(8)服务器停止: ServerSocket.Close();

5.4.2软件设计原理图

13

西安工程大学学士学位论文

服务器方 客户方 Socket(),建立流式套接字,返回套接字句柄sListen。 Bind(),关联一本地地址到套接字sListen。 Listen(),设置backlog值,进入监听状态。 Socket(),建立流式套接字s。 Accept(),等待接受客户连接请求。 Connect(),将套接字s与服务器连接。 建立连接,accept函数返回,得到新的套接字,如sClient。 Recv()/send(),在套接字上收发数据,直到完成交换。 Recv()/send(),在套接字sClient上收发数据,直到完成交换。 Closesocket(),关闭套接字s,结束TCP对话。 Closesocket(),关闭套接字sClient。 Closesocket(),关闭监听套接字sListen,服务结束。

14

第六章 详细设计

第六章 详细设计

6.1 协议设计

6.1.1协议设计原理图

6.1.2协议字段设计说明

(3)fun功能标识定义为枚举类型(enum),占4个byte,共32位。用它来声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型,在win32机器上,枚举类型所占字节数总是4byte,在上面代码片段中sizeof(enum),;sizeof(FUN),sizeof(LOGIN)都是4byte。

(4)Fun分别包括LOGIN,LOGOUT,LOGOK,LOGERR,SHAKE,TRANSMIT,SVRSTOP,ERRL。lLOGIN表示用户登录,

LOGOUT表示用户退出,LOGOK表示用户登陆成功,LOGERR表示用户登陆失败,SHAKE表示震动,TRANSNIT表示信息传输,SRRSTOP表示服务器停止,ERR表示数据传送出错。 (2) senderID定义为char类型,是发送者的标识,用以标记信息的来源ID; (3) RecerverID定义为char类型,是接收者的标识,用以标记信息的目的ID; (4) Connect定义为char类型,是要传输的数据;

(5) Len定义为int类型,记录了传输数据的长度,用于在服务器端进行简单校验,如果出错,则提醒发送者传输错误,同时直接丢弃接受到的错误数据,否则转发数据给接收者;

6.1.3 协议设计代码皮片段

typedef enum {LOGIN,LOGOUT,LOGOK,LOGERR,SHAKE,TRANSMIT,SVRSTOP,ERR} FUN;

15

西安工程大学学士学位论文

typedef struct NET_PACK { FUN fun; char senderID[28]; char RecerverID[28]; char Connect[1024]; int Len;

}NET_PACK;

6.1.4 协议工作方式设计

整个协议设计为Comm.h,作为一个类NET_PACK添加到服务器端和客户机端类的设计中,这里有两种方案:

(1)只设计一个Comm.h文件,与客户端,服务器端的文件存放在同一路经下,分别添加到服务器端和客户端的类中,由服务器和客户共享一个文件;

(2)服务器和客户机各自拥有自己的Comm.h文件,只是Comm.h文件的内容,属性都相同。

6.1.5 可靠性控制

本次协议设计中。可靠性采用简单的传输数据长度检验,客户端把长度作为数据包里一个字段Len传送给服务器,服务器接收到数据包后,取出传输数据数(Connect)其长度并与数据包里的Len值作比对,相同则传送给接收者,否则直接丢弃数据包并对发送者提醒传送错误。相关代码如下:

(1)客户端传送长度

pack.Len=lstrlen(strContent);

(2)服务器检验

if(pPack->len1!=pPack->len2) { DealErr(pPack); }

(3)服务器错误处理

void CDlgTCPSeverDlg::DealErr(NET_PACK *pPack) { list::iterator itor; for (itor = CClientSocket::m_listClient.begin();

16