UDP及TCP通信程序的设计与实现实验报告文档格式.doc
《UDP及TCP通信程序的设计与实现实验报告文档格式.doc》由会员分享,可在线阅读,更多相关《UDP及TCP通信程序的设计与实现实验报告文档格式.doc(17页珍藏版)》请在冰豆网上搜索。
程序源代码(数据结构的描述、核心算法) 4
1.TCP通信程序源代码 4
2.TCP通信程序数据结构的描述 7
3.TCP通信程序的核心算法 7
4.UDP通信程序源代码 8
5.UDP通信程序数据结构的描述 11
6.UDP通信程序的核心算法 12
实验数据、结果分析 13
TCP通信程序实验结果分析 13
UDP通信程序实验结果分析 14
总结 16
实验目的和内容
实验目的
掌握win32平台下,使用winsockAPI来实现UDP通信程序和TCP通信程序。
实验内容
1.实现控制台模式下,在单机上基于UDP的聊天程序;
2.实现控制台模式下,在单机上基于TCP的聊天程序;
3.上述两个程序,最简单的实现方式是:
一方发送、另一方接收、交替进行;
4.提交上述2个程序的源程序,程序代码有充分的注释,并填写实验报告,实验报告的主要内容为说明程序设计的思路,程序代码的流程。
实验环境
在win7系统下,visualstudio2008环境下的win32平台下
程序的逻辑框图
程序源代码(数据结构的描述、核心算法)
1.TCP通信程序源代码
Client端:
#include"
stdafx.h"
#include<
stdlib.h>
stdio.h>
string.h>
winsock.h>
//初始化函数,初始化版本号
intInitSock(BYTEminorVer=2,BYTEmajorVer=2)
{
WSADATAwsaData;
WORDsockVersion=MAKEWORD(minorVer,majorVer);
if(WSAStartup(sockVersion,&
wsaData)!
=0)
exit(0);
return1;
}
intmain()
charrbuf[256];
charszText[256];
InitSock();
//创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚
SOCKETsListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//判断socket是否创建成功
if(sListen==INVALID_SOCKET)
{
printf("
Failedsocket()\n"
);
return0;
}
//用于存储IP地址和端口号的变量
sockaddr_insin;
sin.sin_family=AF_INET;
//IP协议
sin.sin_port=htons(4567);
//端口号
sin.sin_addr.S_un.S_addr=INADDR_ANY;
//接收任何IP的连接
//绑定函数,将socket与IP地址和端口绑定在一块
if(bind(sListen,(LPSOCKADDR)&
sin,sizeof(sin))==SOCKET_ERROR)
Failedbind()\n"
//开始监听,第二个参数表示最大连接数
if(listen(sListen,2)==SOCKET_ERROR)
Failedlisten()\n"
//定义一个新的变量
sockaddr_inremoteAddr;
intnAddrLen=sizeof(remoteAddr);
//用于存储连接客户端的socket
SOCKETsClient;
//accept函数会阻塞,直到等到有socket连接服务器为止,才继续往后执行,并将客户端的IP和端口号存在remoteAddr中
sClient=accept(sListen,(SOCKADDR*)&
remoteAddr,&
nAddrLen);
printf("
接收到一个连接%s\r\n"
inet_ntoa(remoteAddr.sin_addr));
while(TRUE)
if(sClient==INVALID_SOCKET)
{
printf("
Failedaccept()"
continue;
}
send:
"
scanf("
%s"
szText);
//发送函数,往sClient这个socket中发送szText
send(sClient,szText,strlen(szText),0);
//recv为阻塞函数,等待sClient中传来数据
intnRecv=recv(sClient,rbuf,256,0);
if(nRecv>
0)
rbuf[nRecv]='
\0'
;
receive:
%s\n"
rbuf);
closesocket(sClient);
closesocket(sListen);
WSACleanup();
return0;
Server端:
exit(0);
SOCKETs=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s==INVALID_SOCKET)
Failedsocket()\n"
sockaddr_inservAddr;
servAddr.sin_family=AF_INET;
servAddr.sin_port=htons(4567);
//要连接的端口号
servAddr.sin_addr.S_un.S_addr=inet_addr("
127.0.0.1"
//要连接的IP地址
//连接函数,是一个阻塞类型的函数,用s这个socket与服务器地址的某个端口连接,之后往s这个socket中写数据,服务器就能收到
if(connect(s,(sockaddr*)&
servAddr,sizeof(servAddr))==-1)
Failedconnect()\n"
charbuff[256];
while(true){
//接收函数,是一个阻塞类型的函数,等待s这个socket中传来数据,256表示接收的最大字符数
intnRecv=recv(s,buff,256,0);
if(nRecv>
0)
buff[nRecv]='
buff);
//发送函数,往s这个socket中发送szText这个字符串
send(s,szText,strlen(szText),0);
closesocket(s);
2.TCP通信程序数据结构的描述
(1)客户端及服务器都含有存储IP地址及端口号的数据结构,sockaddr_inremoteAddr;
和servAddr
(2)用于存储连接客户端的socket:
SOCKETsClient;
和用于存储连接服务器的socket:
SOCKETs
3.TCP通信程序的核心算法
服务器首先启动,通过调用socket()建立一个套接口,然后bind()将该套接口和本地地址(IP地址和端口)联系在一起,再listen()使套接口做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接,并获得客户机的地址信息;
客户在建立套接口后就可调用connect()和服务器建立连接;
连接一旦建立,客户机和服务器之间就可以通过调用:
send()和recv()(或read()和write())来发送和接收数据;
最后,待数据传送结束后,双方调用closesocket()关闭套接口。
4.UDP通信程序源代码
//在同一主机的不同端口上分别运行服务器程序和客户端程序
WORDRPort=6666;
//远程端口RemotePort
charRIP[16]="
//远程IP地址RemoteIPAddr
WORDLPort=7777;
//本地端口LocalPort
charLIP[16]="
//本地IP地址LocalIPAddr
SOCKETS;
//套接口SOCKET
structsockaddr_inrAddr;
//远程参数,remoteAddr
structsockaddr_inlAddr;
//本地参数,localAddr
WSADATAWD;
//WinsockDLL信息
intr;
//result;
//-----------------------------------------------
vo