华北电力大学 tcp实验报告.docx
- 文档编号:5306030
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:10
- 大小:188.38KB
华北电力大学 tcp实验报告.docx
《华北电力大学 tcp实验报告.docx》由会员分享,可在线阅读,更多相关《华北电力大学 tcp实验报告.docx(10页珍藏版)》请在冰点文库上搜索。
华北电力大学tcp实验报告
华北电力大学
实验报告
|
|
实验名称基于Winsock的多客户并发服务程序的实现
课程名称TCP/IP实验原理
|
|
专业班级:
网络1002学生姓名:
学号:
成绩:
指导教师:
李丽芬实验日期:
2013.5
一、实验目的:
熟悉socket的操作,掌握异步socket的使用方法,理解多线程的概念,初步掌握线程的编程方法。
二、实验要求:
基于Winsock分别编写客户端和服务器端程序,服务器端进行监听,接到客户的请求后服务器与客户建立关联,采用流套接字(TCP)或数据报套接字(UDP)均可。
服务器端接受客户传送来的数据并将其发回给客户端。
服务器端实现接受多个客户的服务请求并为它们服务,接受客户传送来的数据并将数据分别发回给客户端,服务器端和客户端的数据通信采用的是异步方式。
三、实验流程图:
服务器端顺序:
1.加载套接字库
2.创建套接字(socket)
3.将套接字绑定到一个本地地址和端口上(bind)
4.将套接字设为监听模式,准备接收客户请求(listen)
5.等待客户请求的到来;当请求带来后,接受连接请求,返回一个新的对应于此次连
接的套接字(accept)
6.用返回的套接字和客户端进行通信(send/recv)
7.返回,等待另一个客户请求
8.关闭套接字(closesocket)
客户端程序:
1.加载套接字库
2.创建套接字(socket)
3.向服务器发送连接请求(connect)
4.和服务器端进行通信(send/receive)
5.关闭套接字(closesocket)
四、程序中主要函数:
创建基于TCP协议的CS程序的Server端所涉及的相关函数说明:
intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData):
作用是加载套接,字库和进行套接字库的版本协商
a.参数wVersionRequested:
用于指定准备加载的Winsock库的版本,高位字节指定所需要的Winsock库的副版本,低位字节则是主版本,可用MAKEWORD(X,Y)(其中,x为高位字节,y为低位字节)方便获得wVersionRequested的正确值。
b.参数lpWSAData:
指向WSADATA结构的指针,WSAStartup用其加载的库版本有关的信息填在这个结构中。
2.SOCKETsocket(intaf,inttype,intprotocol):
a.参数af指定地址族,对于TCP/IP协议的套接字,它只能是AF_INET。
b.参数type指定Socket类型,对于1.1版本的Socket,它只支持两种类型的套接字,SOCK_STREAM指定产生流式套接字,SOCK_DGRAM产生数据报套接字。
c.参数protocol与特定的地址家族相关的协议,如果指定为0,那么他就会根据地址格式和套接字类别,自动为你选择一个合适的协议。
这是推荐使用的一种选择协议的方式。
3.intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen):
a.第一个参数指定要绑定的套接字,第二个参数指定该套接字的本地地址信息,是指向sockaddr结构的指针变量,由于该地址结构是为了所有的地址家族准备使用的,这个结构可能(通常会)随使用的网络协议不同而不同,所以,要用第三个参数指定该地址结构的长度。
4.intlisten(SOCKETs,intbacklog):
将套接字设置为监听模式,其中第二个参数设置等待请求连接的最大的值,即如果设置为n,则前n个请求会放置在系统的请求连接队列中,应用程序会依次对这些请求进行服务,但第n+1个连接请求则会被拒绝。
5.SOCKETaccept(SOCKETs,conststructsockaddrFAR*addr,intFAR*addrlen):
从客户端接收请求,并创建连接,如果连接成功,则会返回一个当前成功建立连接的套接字,该套接字不是上面创建的监听套接字,而是仅仅适用于当前的一个请求连接,如果建立连接失败,则返回值是INVALID_SOCKET,并且可以适用WSAGetLastError()函数得到相关的失败信息。
6.send函数:
向客户端发送指定信息
7.recv函数:
得到从客户端传递过来的信息
8.closesocket(SOCKETs):
将指定的套接字关闭,从而释放资源
9.WSACleanup():
终止对winsocket库的使用
创建基于TCP协议的CS程序的Client端所涉及的相关函数说明(按使用的先后顺序排列):
1.intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData):
说明同上
2.SOCKETsocket(intaf,inttype,intprotocol):
说明同上
3.connect函数:
同服务器建立连接
4.send/recv:
发送与接收,同上
5.closesocket:
关闭套接字
五、实验结果:
服务器端先运行:
客户端运行后先输入
最后输入*退出程序。
六、实验心得
通过本次实验,我了解了windowssockets的工作原理以及初步编写socket客户端与服务器的方法,对书上一些知识有了一定的认识。
TCP:
面向连接的可靠的传输协议,通信前建立三次握手,握手成功后才能通信,对数据准确性要求较高的场合使用,如从网上载的安装文件,不能缺少任何信息。
UDP:
是无连接的,不可靠的传输协议,不需要建立连接,也没有重传和确认的机制,在实时性要求较高,但对数据准确度要求不是很高的场合使用。
当中丢失个别数据包并不影响整体的效果。
同时还进一步了解了sockets的通信过程。
实验的过程中遇到了一些困难,不过都被一一解决了,所以在实验的同时还进一步熟悉了C++语言的运用。
七、实验代码
服务器:
#include
#include
voidmain()
{
WORDwVersionRequested;
WSADATAwsaData;
interr;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!
=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!
=1||HIBYTE(wsaData.wVersion)!
=1)
{
WSACleanup();
return;
}
SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
charsendBuf[100];
charrecvBuf[100];
listen(sockSrv,5);
SOCKADDR_INaddrClient;
intlen=sizeof(SOCKADDR);
SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
while
(1)
{
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
printf("Pleaseinputdata:
\n");
gets(sendBuf);
if('*'==sendBuf[0])
{
printf("Chatend!
\n");
break;
}
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
}
closesocket(sockConn);
closesocket(sockSrv);
WSACleanup();
}
客户端:
#include
#include
voidmain()
{
WORDwVersionRequested;
WSADATAwsaData;
interr;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!
=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!
=1||HIBYTE(wsaData.wVersion)!
=1)
{
WSACleanup();
return;
}
SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
charrecvBuf[100];
charsendBuf[100];
while
(1)
{
printf("Pleaseinputdata:
\n");
gets(sendBuf);
if('*'==sendBuf[0])
{
printf("Chatend!
\n");
break;
}
send(sockClient,sendBuf,strlen(sendBuf)+1,0);
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
}
closesocket(sockClient);
WSACleanup();
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华北电力大学 tcp实验报告 华北电力 大学 tcp 实验 报告