《计算机网络》课程设计报告.docx
《《计算机网络》课程设计报告.docx》由会员分享,可在线阅读,更多相关《《计算机网络》课程设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
《计算机网络》课程设计报告
海南大学信息科学技术学院
《计算机网络》课程设计报告
班级:
计算机科学与技术一、三班
组员:
指导老师:
完成日期:
2011年12月15日
【摘要】本设计采用MFC6.0作为开发工具,其中第2部分编写UDP客户/服务器程序
编写程序,实现了以下要求:
(1)使用UDP服务实现客户端与服务器交互信息
(2)有运行截图;其中第3部分发送TCP数据包本设计的目的是填充一个TCP数据包,并发送给目的主机;其中第4部分简单FTP功能模拟编写程序,设计客户/服务器实现小型文件传输,采用了TCP协议。
【关键词】UDP,TCP,FTP
1、引言
UDP(UserDatagramProtocol)是用户数据包协议的缩写。
TCP(TransmissionControlProtocol)是传输控制协议的缩写。
FTP(FileTransferProtocol)是文件传输协议的缩写
2、编写UDP客户/服务器程序
使用UDP服务实现客户端与服务器交互信息
2.1.UDP服务端设计
主要用于对客户端进行连接
2.1.1、UDP服务端主窗体设计
设计主窗体如图2.1所示。
图2.1服务器端主窗体
2.1.2、服务器端源代码
#include
#include
#include
#defineDEFAULT_PORT5050
#defineBUFFER_LENGTH1024
#pragmacomment(lib,"WS2_32.lib")
voidmain()
{
intiPort=DEFAULT_PORT;
WSADATAwsaData;
SOCKETsSocket;
intiLen,iRecv,iSend;
structsockaddr_inser,cli;
charsend_buf[]="Hollo!
Iamaserver";
charrecv_buf[BUFFER_LENGTH];
printf("--------------------");
printf("Serverwaiting");
printf("--------------------");
if(WSAStartup(MAKEWORD(2,2),&wsaData)!
=0)
{
printf("环境初始化错误:
\n");
return;
}
sSocket=socket(AF_INET,SOCK_DGRAM,0);
if(sSocket==INVALID_SOCKET)
{
printf("socket()函数调用失败:
\n",WSAGetLastError());
return;
}
ser.sin_family=AF_INET;
ser.sin_port=htons(iPort);
ser.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sSocket,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR)
{
printf("bind()函数调用失败:
\n",WSAGetLastError());
return;
}
iLen=sizeof(cli);
memset(recv_buf,0,sizeof(recv_buf));
while
(1)
{
iRecv=recvfrom(sSocket,recv_buf,BUFFER_LENGTH,0,(SOCKADDR*)&cli,&iLen);
if(iRecv==SOCKET_ERROR)
{
printf("recvfrom()函数调用失败:
\n",WSAGetLastError());
break;
}
elseif(iRecv==0)
break;
else
{
printf("recvfrom():
%d\n",recv_buf);
printf("客户端的IP地址、端口号:
%d\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));
}
iSend=sendto(sSocket,send_buf,sizeof(send_buf),0,(SOCKADDR*)&cli,sizeof(cli));
if(iSend==SOCKET_ERROR)
{
printf("sendto()函数调用失败:
\n",WSAGetLastError());
break;
}
elseif(iSend==0)
break;
else
{
printf("sendto():
调用成功!
\n");
}
}
closesocket(sSocket);
WSACleanup();
}
2.2、客户机端设计
主要用于对服务器端进行连接,并发送数据,及接收服务器端发送过来的数据。
2.2.1、客户机端主窗体设计
设计主窗体如图2.2所示。
图2.2客户机端主窗体
2.2.2、客户机端主窗体设计源代码
#include
#include
#include
#defineDEFAULT_PORT5050
#defineDATA_BUFFER1024
#pragmacomment(lib,"WS2_32.lib")
voidmain(intargc,char*argv[])
{
WSADATAwsaData;
SOCKETsClient;
intiPort=5050;
intiLen;
intisend,iRecv;
charsend_buf[]="Hello!
Iamaclient";
charrecv_buf[DATA_BUFFER];
structsockaddr_inser;
if(argc<2)
{
printf("输入服务器的IP地址:
\n");
return;
}
else
memset(recv_buf,0,sizeof(recv_buf));
if(WSAStartup(MAKEWORD(2,2),&wsaData)!
=0)
{
printf("Winsock环境初始化失败:
\n");
return;
}
sClient=socket(AF_INET,SOCK_DGRAM,0);
if(sClient==INVALID_SOCKET)
{
printf("socket()函数调用失败:
%d\n",WSAGetLastError());
return;
}
ser.sin_family=AF_INET;
ser.sin_port=htons(iPort);
ser.sin_addr.s_addr=inet_addr(argv[1]);
iLen=sizeof(ser);
isend=sendto(sClient,send_buf,sizeof(send_buf),0,(structsockaddr*)&ser,iLen);
if(isend==SOCKET_ERROR)
{
printf("sendto()函数调用失败:
%d\n",WSAGetLastError());
return;
}
elseif(isend==0)
return;
else
printf("sendto()调用成功:
\n");
iRecv=recvfrom(sClient,recv_buf,sizeof(recv_buf),0,(structsockaddr*)&ser,&iLen);
if(iRecv==SOCKET_ERROR)
{
printf("recvfrom()函数调用失败:
%d\n",WSAGetLastError());
return;
}
elseif(iRecv==0)
return;
else
{
printf("sendto():
%s\n",recv_buf);
printf("-------------------------------\n");
}
closesocket(sClient);
WSACleanup();
}
2.3、运行结果
3发送TCP数据包
实现了填充一个TCP数据包,并发送给目的主机。
3.1构造IP头和TCP头
代码如下:
ypedefstruct_iphdr//定义IP首部
{
UCHARh_lenver;//4位首部长度+4位IP版本号
UCHARtos;//8位服务类型TOS
USHORTtotal_len;//16位总长度(字节)
USHORTident;//16位标识
USHORTfrag_and_flags;//3位标志位
UCHARttl;//8位生存时间TTL
UCHARproto;//8位协议(TCP,UDP或其他)
USHORTchecksum;//16位IP首部校验和
ULONGsourceIP;//32位源IP地址
ULONGdestIP;//32位目的IP地址
}IP_HEADER;
typedefstructpsd_hdr//定义TCP伪首部
{
ULONGsaddr;//源地址
ULONGdaddr;//目的地址
UCHARmbz;//没用
UCHARptcl;//协议类型
USHORTtcpl;//TCP长度
}PSD_HEADER;
typedefstruct_tcphdr//定义TCP首部
{
USHORTth_sport;//16位源端口
USHORTth_dport;//16位目的端口
ULONGth_seq;//32位序列号
ULONGth_ack;//32位确认号
UCHARth_lenres;//4位首部长度/6位保留字
UCHARth_flag;//6位标志位
USHORTth_win;//16位窗口大小
USHORTth_sum;//16位校验和
USHORTth_urp;//16位紧急数据偏移量
}TCP_HEADER;
3.2.计算校验和的子函数
实现代码如下:
USHORTchecksum(USHORT*buffer,intsize)
{
unsignedlongcksum=0;
while(size>1)
{
cksum+=*buffer++;
size-=sizeof(USHORT);
}
if(size)
{
cksum+=*(UCHAR*)buffer;
}
cksum=(cksum>>16)+(cksum&0xffff);
cksum+=(cksum>>16);
return(USHORT)(~cksum);
}
3.3程序总源代码:
#include
#includ