华北电力大学 tcp实验报告.docx

上传人:b****4 文档编号:5306030 上传时间:2023-05-08 格式:DOCX 页数:10 大小:188.38KB
下载 相关 举报
华北电力大学 tcp实验报告.docx_第1页
第1页 / 共10页
华北电力大学 tcp实验报告.docx_第2页
第2页 / 共10页
华北电力大学 tcp实验报告.docx_第3页
第3页 / 共10页
华北电力大学 tcp实验报告.docx_第4页
第4页 / 共10页
华北电力大学 tcp实验报告.docx_第5页
第5页 / 共10页
华北电力大学 tcp实验报告.docx_第6页
第6页 / 共10页
华北电力大学 tcp实验报告.docx_第7页
第7页 / 共10页
华北电力大学 tcp实验报告.docx_第8页
第8页 / 共10页
华北电力大学 tcp实验报告.docx_第9页
第9页 / 共10页
华北电力大学 tcp实验报告.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

华北电力大学 tcp实验报告.docx

《华北电力大学 tcp实验报告.docx》由会员分享,可在线阅读,更多相关《华北电力大学 tcp实验报告.docx(10页珍藏版)》请在冰点文库上搜索。

华北电力大学 tcp实验报告.docx

华北电力大学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();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2