计算机网路课程设计毕业设计Word格式.docx
《计算机网路课程设计毕业设计Word格式.docx》由会员分享,可在线阅读,更多相关《计算机网路课程设计毕业设计Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
![计算机网路课程设计毕业设计Word格式.docx](https://file1.bdocx.com/fileroot1/2022-12/14/5fc79f68-5364-4483-a105-7ab2112c0a25/5fc79f68-5364-4483-a105-7ab2112c0a251.gif)
IP功能:
IP的主要目的是为数据输入/输出网络提供基本算法,为高层协议提供无连接的传送服务。
这意味着在IP将数据递交给接收站点以前不在传输站点和接收站点之间建立对话(虚拟链路)。
它只是封装和传递数据,但不向发送者或接收者报告包的状态,不处理所遇到的故障。
TCP:
TCP(传输控制协议TransmissionControlProtocol)是重要的传输层协议,传输层软件TCP的目的是允许数据同网络上的另外站点进行可靠的交换。
它能提供端口编号的译码,以识别主机的应用程序,而且完成数据的可靠传输。
TCP协议具有严格的内装差错检验算法确保数据的完整性。
TCP是面向字节的顺序协议,这意味着包内的每个字节被分配一个顺序编号,并分配给每包一个顺序编号。
用户数据报文协议:
UDP(用户数据报协议UserDatagramProtocol)也是TCP/IP的传输层协议,它是无连接的,不可靠的传输服务。
当接收数据时它不向发送方提供确认信息,它不提供输入包的顺序,如果出现丢失包或重份包的情况,也不会向发送方发出差错报文。
UDP的主要作用是分配和管理端口编号,以正确无误的识别运行在网络站点上的个别应用程序。
由于它执行功能时具有较低的开销,因而执行速度比TCP快。
它多半用于不需要可靠传输的应用程序,例如网络视频点播和视频会议等。
b.网络编程基础
socket概述:
linux中的网络编程通过socket接口实现。
Socket既是一种特殊的IO,它也是一种文件描述符。
一个完整的Socket都有一个相关描述{协议,本地地址,本地端口,远程地址,远程端口};
每一个Socket有一个本地的唯一Socket号,由操作系统分配。
套接字有三种类型:
流式套接字(SOCK_STREAM):
流式的套接字可以提供可靠的、面向连接的通讯流。
它使用了TCP协议。
TCP保证了数据传输的正确性和顺序性。
数据报套接字(SOCK_DGRAM):
数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。
使用数据报协议UDP协议。
原始套接字:
原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。
structsockaddr{
unsignedshortsa_family;
/*address族,AF_xxx*/
charsa_data[14];
/*14bytes的协议地址*/
};
sa_family一般来说,IPV4使用“AF_INET”。
sa_data包含了一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂溶在一起的。
structsockaddr_in{
shortintsin_family;
/*Internet地址族*/
unsignedshortintsin_port;
/*端口号*/
structin_addrsin_addr;
/*Internet地址*/
unsignedcharsin_zero[8];
/*添0(和structsockaddr一样大小)*/
这两个数据类型是等效的,可以相互转换,通常使用sockaddr_in更为方便
地址字节序列转化:
因为每一个机器内部对变量的字节存储顺序不同(有的系统是高位在前,底位在后,而有的系统是底位在前,高位在后),而网络传输的数据大家是一定要统一顺序的。
所以对与内部字节表示顺序和网络字节顺序不同的机器,就一定要对数据进行转换。
下面给出套接字字节转换程序的列表:
htons()——“HosttoNetworkShort”主机字节顺序转换为网络字节顺序(对无符号短型进行操作2bytes)
htonl()——“HosttoNetworkLong” 主机字节顺序转换为网络字节顺序(对无符号长型进行操作4bytes)
ntohs()——“NetworktoHostShort” 网络字节顺序转换为主机字节顺序(对无符号短型进行操作2bytes)
ntohl()——“NetworktoHostLong” 网络字节顺序转换为主机字节顺序(对无符号长型进行操作4bytes)
三.程序设计原理图
四.程序源代码
五.Server.cpp
#include<
stdio.h>
winsock2.h>
string.h>
conio.h>
iostream>
//创建套接字描述符
SOCKETserver;
SOCKETclient;
WSADATAWSAData;
intWSAreturn;
//用来存放ip地址和端口号
structsockaddr_inlocal;
structsockaddr_infrom;
//远程主机的地主长度
intfromlen=sizeof(from);
//信息缓冲区
charinformation[50];
//有客户登录时返回的第一条信息
charwelcome[]="
欢迎您登陆李仕贤主机!
----零度工作室\n"
;
//收到信息的缓冲区
charreceive[256];
charchat[256];
charc;
inti=0;
boolcansend=false;
intGetIp()
{
//初始化说明版本号
WSAreturn=WSAStartup(0x101,&
WSAData);
if(WSAreturn)
printf("
[server@root]#发生一个未知错误!
\n"
);
return0;
}
//AF-INET代表Internet(TCP/IP)地址族
local.sin_family=AF_INET;
//ip为INADDR_ANY,系统会自动填入本机IP地址
local.sin_addr.s_addr=INADDR_ANY;
//端口号设为8888,以后通信就通过此端口
local.sin_port=htons((8888));
//创建套接字,指定是流式套接字是用tcp协议
server=socket(AF_INET,SOCK_STREAM,0);
if(server==INVALID_SOCKET)
[server@root]#无法创建套接字!
//套接字绑定端口和ip地址,所以信息到达主机后就能找到进程,,
if(bind(server,(sockaddr*)&
local,sizeof(local))!
=0)
[server@root]#无法绑定套接字!
//侦听侦听数为5
if(listen(server,5)!
[server@root]#无法监听端口!
while(true)
[server@root]#正在等待用户连接...\n"
//接受客户端的连接,没有连接时则阻塞。
。
client=accept(server,(structsockaddr*)&
from,&
fromlen);
//有连接,则发送一条欢迎的信息
strcpy(information,inet_ntoa(from.sin_addr));
strcat(welcome,information);
printf("
[server@root]#接受来自%s的连接...\n"
inet_ntoa(from.sin_addr));
[server@root]#正在发送欢迎消息...\n"
//发送信息
send(client,welcome,strlen(welcome),0);
[server@root]#欢迎消息信息已经成功发送至客户端!
while
(1)
if(!
cansend)
[server@root]#正在等待对方发来消息...\n"
cansend=false;
//接受信息,,如果信息没有,则阻塞。
recv(client,receive,sizeof(receive),0);
*********接受到的消息***********\n"
[server@root]#%s\n"
receive);
**************结束**************\n"
cansend=true;
else
[server@root]#请输入下一条消息:
"
scanf("
%s\0"
&
chat);
send(client,chat,strlen(chat),0);
\n[server@root]#已经成功发送出信息!
//关闭套接字
closesocket(client);
closesocket(server);
WSACleanup();
return1;
voidmain()
intok;
ok=GetIp();
//套接字的创建,信息的发送和接收
if(ok==0)
[server@root]#无法完成请求!
Client.cpp
structsockaddr_into;
charinformation[256];
我已经登陆到你的主机!
//设置信息的缓冲区
charchatto[256];
charservername[256];
charchatfrom[256];
longresult;
boolcansend=true;
//连接主机。
intconnection()
//初始化。
//创建套接字,用来与服务器连接
client=socket(AF_INET,SOCK_STREAM,0);
//表示使用tcp协议
to.sin_family=AF_INET;
//设置端口号,要转化为网络的大端的地址格式
to.sin_port=htons(8888);
[server@root]#请输入要登陆的IP:
%s"
servername);
//主机的ip地址,要进行字节序列转化和地址格式转化
to.sin_addr.s_addr=inet_addr(servername);
[server@root]#正在连接...\n"
//连接主机,连接失败返回-1
result=connect(client,(structsockaddr*)&
to,sizeof(to));
if(SOCKET_ERROR==result)
//连接失败
[server@root]#无法连接到目标主机!
//接收由服务器发来的信息
recv(client,receive,sizeof(receive),0);
*******欢迎消息消息*******\n"
***********结束*********\n"
if(cansend)
[server@root]#请输入下一条信息:
//从键盘获得信息
chatto);
//将信息发送到服务器
send(client,chatto,strlen(chatto),0);
\n[server@root]#已经成功发送信息!
//cansend置零下一步接收信息
正在等待对方发来消息...\n"
//接收信息,信息还没到达时候就阻塞
recv(client,chatfrom,sizeof(chatfrom),0);
*******接收到的消息*******\n"
chatfrom);
//下一步发送信息
//关闭套接字
connection();
}
六.参考文献
1.计算机网络(第三版)安淑之黄彦中国铁道出版社
2.linux编程指南张辉