资源描述
基于TCP协议下简单网络通信与实现
摘要
本文设计并实现了在Windows下基于局域网内TCP协议简单即时通信系统, 系统采取TCP/IP模式, 底层通信经过SOCKET套接字接口对端口进行监听, 当有消息发送来时, 做出对应处理, 服务器负责用户端登录验证。本文首先讨论了套接字创建、 绑定、 将套接字设置为监听模式、 接收信息和关闭套接字从而实现简单网络通信, 然后叙述了怎样使用C++来模拟基于TCP协议下用户服务方法网络通信过程。因为在此设计中关键是使用C程序形式来模拟TCP协议传输方法, 从而实现面向对象可靠传输, 在这种情况下无需对IP协议进行讨论。
关键字: 套接字 TCP协议
目录
1、 引言…………………………………………………………………………………....
1.1、 课程背景...............................................................................................................
1.2、 相关技术介绍.......................................................................................................
1.3、 TCP协议…………………………………………………………………………
1.4、 TCP——传输控制协议………………………………………………………….
1.5、 套接字……………………………………………………………………………
2、 系统框架.........................................................................................................................
3、 系统设计步骤图.............................................................................................................
4、 系统实现.....................................................................................................................
4.1、 服务器端程序..............................................................................................................
4.2、 用户端程序..................................................................................................................
结论……………………………………………………………………………………
参考文件………………………………………………………………………………
1、 引言
1.1、 课题背景
TCP/IP起源于美国国防部高级研究计划布署(DARPA)一项研究计划——实现若干台主机相互通信。现在, TCP/IP已成为Internet上通信工业标准。
因为OSI模型七层参考模型比较复杂, 而且在实际利用中难以实现, 所以现在应用比较多是TCP/IP模型, 该模型包含4个层次:
应用层
运输层
网络层
网络接口层
对于TCP/IP网络层次模式, 关键协议是网络层IP协议, 和运输层TCP协议, 这也是为何成为TCP/IP协议缘由。
1.2、 相关技术介绍
NET开发平台及C#.NET开发语言
NET框架是Microsoft企业推出一个全新开发平台,提供了统一、 面向对象而且能够扩展编程类库和完善集成开发环境,大大简化了应用程序开发过程,而且含有良好移植性和安全性。
微软为了推行.NET战略, 尤其为.NET平台设计了一个语言——C#。C#是由C和C++派生而来一个“简单、 流行、 面向对象、 类型安全”程序设计语言, 其综合了Visual basic高效率和C++强大功效, 然而更多人感觉C#更类似JAVA。实际上C#融合了大量JAVA思想, C#是.NET关键性语言, 它是整个.NET平台基础。与C#相比, .NET所支持其它语言显然是配角, 包含VC++.NET在内。不过微软并没有计划放弃VC++.NET, 相反, 微软对VC++.NET有着另一番独特计划, VC++.NET定位与C#不完全重合, VC++.NET应用范围仍强于C#, 这一点不管对微软企业还是软件业应用现实状况都非常关键。
可见VC++.NET在NET框架中已经退化成了底层语言了, 就像C++之前标准C语言一样, 以后将只有开发底层或桌面程序程序员使用它。它即使依旧强大, 不过已经不是主流, 而主流就是C#语言。
1.3、 TCP协议
TCP/IP网络协议
协议是对等网络实体之间通信规则, 能够简单地了解为网络上各计算机相互交流一个“语言”。网络通信协议设计基础标准是层次化, 层和协议集合被称为网络体系结构。相邻层之间接口定义了下层向上层提供基础操作和服务, 下层向上层提供服务分两种形式: 面向连接服务和无连接服务。
计算机网络中已经形成网络体系结构关键有两个: OSI参考模型和TCP/IP参考模型。TCP/IP参考模型是因特网(Internet)基础。和OSI7层协议相比, TCP/IP协议只有4个层次。通常说TCP/IP是一组协议总称, TCP/IP实际上是一个协议族, 包含100多个相互关联协议, 其中IP(Internet Protocol, 网际协议)是网络层最关键协议; TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议是传输层中最关键协议), 通常认为IP、 TCP、 UDP是最根本三种协议, 是其她协议基础。
1.4、 TCP——传输控制协议
面向连接通信能够使用可靠通信, 在这时候, 第四层协议发送数据接收方确定, 假如未收到数据或者数据被损坏, 则请求重新传输。TCP协议就使用这种可靠通信。
使用TCP协议应用层协议包含HTTP、 FTP、 SMTP和Telnet等。
TCP要求在发送数据之前必需打开连接。服务器应用程序必需实施一个称作被动打开(passive open)操作, 以利用一个已知端口号创建一个链接, 这是, 服务器并不是对网络进行呼叫, 而是侦听并等候引入请求。用户应用程序必需实施一个主动打开(active open), 为此, 它向服务器应用程序发送一个同时序列号(SYN)以标识连接。用户应用程序能够将动态端口号作为当地端口使用。服务器必需向用户发送一个确定(ACK)以及服务器序列号(SYN)。随即, 用户回复一个ACK, 这么就建立了链接。
现在能够发送和接收消息了。接收消息后, 总是返回ACK消息。假如在收到ACK之前发送方已经超时, 则消息将被放到重发队列中以再次发送。
因为它握手机制, 所以TCP协议比较复杂而且费时, 但此协议在处理数据时对数据包传送有保障, 从而使得在应用程序协议中不需要再包含该功效。
1.5、 套接字
套接字这个术语并没有定义某个协议: 它含有两层含义, 但二者都与一个协议相关。第一个含义是套接字编程API, 它最初由伯克利大学为BSD UNIX而创建。BSD套接字在经过修改后被用作Windows环境编程接口(而且被命名为WinSock)。WinSock API被包装在System.Net.sockets命名空间.NET类中。Windows Sockets 是一个独立于协议编程接口, 用于编写网络应用程序。
套接字第二层含义表示一个用于在进程间进行通信终端。在TCP/IP中, 每个终端都与一个IP地址和一个端口号绑定。我们必需对流式套接字和数据报套接字这两种类型进行区分。流失套接字用TCP/IP协议来使用面向连接通信; 其次, 数据报套接字用UDP/IP来使用无连接通信。
2、 系统框架
3、 系统设计
4、 系统实现
4.1、 服务器端程序
#include <Winsock2.h>
#include <stdio.h>
Void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaDdata;
Int error;
wVersionRequested=MAKEWORD(1,1);
err=WSAStarup(wVersionRequested,&wsaDATA);
if(err!=0) {
return;
}
If(LOBYTE(wsadata.wVersion)!=1||HIBYTE(wsadata.wVersion)!=1)
{
WSACleanup();
Return;
}
//创建用于监听套接字
SOCKET sockSrv=socket (AF-INET,SOCK-STREAM,0);
SOCKADDR-IN addrSrv;
addrSrv.sin-addr.S-un.S-addr=hotonl(INADDR-ANY);
addrSrv.sin-family=AF-INET;
addrSrv.sin-port=htons(6000)
//绑定套接字
Bind(sockSrv ,(SOCKADDR*)&addrSrv ,sizeof(SOCKADDR));
//将套接字设为监听模式, 准备接收用户请求
Listen(sockSrv,s);
SOCKADDR-IN addrClient;
Int len=sizeof( SOCKADDR );
While(1)
{
//等候用户请求到来
SOCKET sockConn=accept(sockSrv ,( SOCKADDR*)&addrClient ,&len);
Char sendBuf(100);
Sprintf(sendBuf ,)”Welcom %s to ” ,ine-ntoa(addrClient.sin-addr));
//发送数据
Send(sockConn ,sendbuf ,strlen(sendBuf)+1,0);
Char recvBuf(100);
//接收数据
Recv(sockConn,recvBuf ,100 ,0);
//打印接收数据
Printf(“%s\n”,recvBuf);
//关闭套接字
Closesocket(sockConn);
}
}
4.2、 用户端程序
#include <Winsock2.h>
#include <stdio.h>
Void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaDdata;
Int error;
wVersionRequested=MAKEWORD(1,1);
err=WSAStarup(wVersionRequested,&wsaDATA);
if(err!=0) {
return;
}
If(LOBYTE(wsadata.wVersion)!=1||HIBYTE(wsadata.wVersion)!=1)
{
WSACleanup();
Return;
}
//创建套接字
SOCKET sockSrv=socket (AF-INET,SOCK-STREAM,0);
SOCKADDR-IN addrSrv;
addrSrv.sin-addr.S-un.S-addr=hotonl(INADDR-ANY);
addrSrv.sin-family=AF-INET;
addrSrv.sin-port=htons(6000)
//向服务器发出连接请求
Connect (sockClient ,(SOCKADDR*)&addrSrv ,sizeof(SOCKADDR));
//接收数据
Char recvBuf[100];
Recv(sockClient , recvBuf ,100 ,0);
Printf(“%s\n”,recvBuf);
//发送数据
Send(sockClient ,” This is lisi ”, strlen(“This in lisi”)+1 ,0);
//关闭套接字
Closesocket(sockConn);
WSACLeanup() ;
}
}
结论
在此设计中仅仅适合于数量少计算机间通信, 其中一个缺点是, 当多台计算机同时进行通信时, 会照成网络拥塞, 可能造成消息传输中丢失, 此设计没有做出处理方案, 但有这么方案猜想, 为了处理拥塞问题, 能够使用慢开始、 拥塞避免、 快从传和快恢复算法, 进而改善此设计, 不过这会包含大量数学运算。此设计还存另一个缺点, 没有实现可靠传输, TCP协议可靠传输机制是用字节序号进行传输控制, 而这里仅是监听端口是否有数据发送, 假如有, 就接收, 没有就继续监听。
参考文件
[1]孙鑫, VC++深入详解[M]北京: 电子工业出版社, .7: 528-546
[2]谢希仁, 计算机网络[M]北京: 电子工业出版社, .1: 180-210
展开阅读全文