《计算机网络》课程设计报告文档格式.docx
- 文档编号:15704183
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:19
- 大小:263.22KB
《计算机网络》课程设计报告文档格式.docx
《《计算机网络》课程设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《《计算机网络》课程设计报告文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
2、编写UDP客户/服务器程序
使用UDP服务实现客户端与服务器交互信息
2.1.UDP服务端设计
主要用于对客户端进行连接
2.1.1、UDP服务端主窗体设计
设计主窗体如图2.1所示。
图2.1服务器端主窗体
2.1.2、服务器端源代码
#include<
Winsock2.h>
stdio.h>
stdlib.h>
#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("
--------------------"
);
Serverwaiting"
if(WSAStartup(MAKEWORD(2,2),&
wsaData)!
=0)
{
printf("
环境初始化错误:
\n"
return;
}
sSocket=socket(AF_INET,SOCK_DGRAM,0);
if(sSocket==INVALID_SOCKET)
socket()函数调用失败:
WSAGetLastError());
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)
bind()函数调用失败:
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)
recvfrom()函数调用失败:
break;
elseif(iRecv==0)
else
recvfrom():
%d\n"
recv_buf);
客户端的IP地址、端口号:
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)
sendto()函数调用失败:
elseif(iSend==0)
sendto():
调用成功!
closesocket(sSocket);
WSACleanup();
}
2.2、客户机端设计
主要用于对服务器端进行连接,并发送数据,及接收服务器端发送过来的数据。
2.2.1、客户机端主窗体设计
设计主窗体如图2.2所示。
图2.2客户机端主窗体
2.2.2、客户机端主窗体设计源代码
#defineDATA_BUFFER1024
voidmain(intargc,char*argv[])
SOCKETsClient;
intiPort=5050;
intiLen;
intisend,iRecv;
Hello!
Iamaclient"
charrecv_buf[DATA_BUFFER];
structsockaddr_inser;
if(argc<
2)
输入服务器的IP地址:
return;
else
Winsock环境初始化失败:
sClient=socket(AF_INET,SOCK_DGRAM,0);
if(sClient==INVALID_SOCKET)
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)
elseif(isend==0)
sendto()调用成功:
iRecv=recvfrom(sClient,recv_buf,sizeof(recv_buf),0,(structsockaddr*)&
ser,&
elseif(iRecv==0)
%s\n"
-------------------------------\n"
closesocket(sClient);
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计 报告