计算机网络实验四.docx
- 文档编号:3782457
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:12
- 大小:75.18KB
计算机网络实验四.docx
《计算机网络实验四.docx》由会员分享,可在线阅读,更多相关《计算机网络实验四.docx(12页珍藏版)》请在冰豆网上搜索。
计算机网络实验四
淮海工学院计算机工程学院
实验报告书
课程名:
《计算机网络》
题目:
实验四基于Socket的C/S程序开发
班级:
学号:
姓名:
一、实验目的和要求
通过本次实验,熟悉客户-服务器模式的工作原理,使用socket通信一个编写客户端和服务器端之间通信的程序。
二、实验内容
使用socket编写客户端和服务器端之间通信的程序,要求:
从标准输入获取客户端的输入,将其发送到服务器端,并将服务器端所返回的信息显示在客户端的标准输出。
三、主要实验仪器及材料
装有Windows2000/XP系统的计算机,局域网,java或其他编程语言。
四、实验原理与源程序
原理:
1、创建socket
2、打开连接到socket的输入/输出流
3、按照一定协议对socket进行读/写操作
4、关闭socket
源程序
服务器端
#include"Winsock.h"
#include"windows.h"
#include"stdio.h"
#pragmacomment(lib,"wsock32.lib")
#defineRECV_PORT2000
#defineSEND_PORT3000
SOCKETsock,sock1;
sockaddr_inServerAddr;
sockaddr_inClientAddr;
intAddrlen;
DWORDStartSock()
{
WSADATAWSAData;
if(WSAStartup(MAKEWORD(2,2),&WSAData)!
=0)
{
printf("sockinitfail!
\n");
return(-1);
}
return
(1);
}
DWORDCreateSocket()
{
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==SOCKET_ERROR)
{
printf("sockcreatefail!
\n");
WSACleanup();
return(-1);
}
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY);
ServerAddr.sin_port=htons(RECV_PORT);
if(bind(sock,(structsockaddrFAR*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
{
printf("bindistheerror");
return(-1);
}
return
(1);
}
DWORDTCPS();
DWORDConnectProcess()
{
charbuff[80];
Addrlen=sizeof(sockaddr_in);
if(listen(sock,5)<0)
{
printf("搜索出错!
");
return(-1);
}
printf("正在搜索...\n");
for(;;)
{
sock1=accept(sock,(structsockaddrFAR*)&ClientAddr,&Addrlen);
for(;;)
{
memset(buff,0,80);
if(recv(sock1,buff,80,0)<=0)
{
break;
}
if(strcmp(buff,"exit")==0)
{
closesocket(sock1);
WSACleanup();
exit(0);
}
printf("接收到的信息是:
");
printf(buff);
printf("\n");
TCPS();
}
}
}
DWORDTCPSend(chardata[])
{
intlength;
length=send(sock1,data,strlen(data),0);
if(length<=0)
{
printf("发送数据出错!
\n");
closesocket(sock1);
WSACleanup();
return(-1);
}
return
(1);
}
DWORDTCPRecv(chardata[])
{
charbuff[80];
Addrlen=sizeof(sockaddr_in);
sock1=accept(sock,(structsockaddrFAR*)&ServerAddr,&Addrlen);
while(sock1!
=SOCKET_ERROR)
{
memset(buff,0,80);
if(recv(sock1,buff,80,0)<=0)
{
break;
}
printf(buff);
}
printf("\n");
return
(1);
}
DWORDTCPS()
{
charbuff[80];
charnum[80];
memset(buff,0,80);
printf("请输入要发送的信息(输入exit结束通信):
");
scanf("%s",&num);
strcpy(buff,num);
if(strcmp(buff,"exit")==0)
{
printf("服务器关闭!
\n");
TCPSend(buff);
closesocket(sock1);
exit(0);
}
printf("\n");
TCPSend(buff);
return1;
}
intmain()
{
if(StartSock()==-1)
return(-1);
if(CreateSocket()==-1)
return(-1);
if(ConnectProcess()==-1)
return(-1);
if(TCPS()==-1)
return(0);
StartSock();
CreateSocket();
for(;;)
ConnectProcess();
return
(1);
}
客户端
#include"Winsock.h"
#include"windows.h"
#include"stdio.h"
#pragmacomment(lib,"wsock32.lib")
#defineRECV_PORT2000
#defineSEND_PORT4000
SOCKETsock,sock1;
sockaddr_inServerAddr;
intAddrlen;
DWORDStartSock()
{
WSADATAWSAData;
if(WSAStartup(MAKEWORD(2,2),&WSAData)!
=0)
{
printf("sockinitfail!
\n");
return(-1);
}
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
ServerAddr.sin_port=htons(RECV_PORT);
return1;
}
DWORDCreateSocket()
{
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==SOCKET_ERROR)
{
printf("sockcreatefail!
\n");
WSACleanup();
return(-1);
}
return1;
}
DWORDCallServer()
{
CreateSocket();
if(connect(sock,(structsockaddr*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
{
printf("连接失败!
\n");
closesocket(sock);
return(-1);
}
return1;
}
DWORDTCPRecv();
DWORDTCPSend(chardata[])
{
intlength;
length=send(sock,data,strlen(data),0);
if(length<=0)
{
printf("发送数据错误!
\n");
closesocket(sock);
WSACleanup();
return(-1);
}
TCPRecv();
return
(1);
}
DWORDTCPRecv()
{
charbuff[80];
memset(buff,0,80);
if(recv(sock,buff,80,0)<=0)
{
return-1;
}
if(strcmp(buff,"exit")==0)
{
closesocket(sock1);
WSACleanup();
exit(0);
}
printf("接收到的信息是:
");
printf(buff);
printf("\n");
return
(1);
}
intmain()
{
charbuff[80];
charnum[80];
StartSock();
while(CallServer()==-1);
printf("通信连接成功\n");
printf("请按Enter开始通信\n");
getchar();
for(;;)
{
printf("请输入要发送的信息(输入exit结束通信):
");
memset(buff,0,80);
scanf("%s",&num);
if(num<=0)
break;
strcpy(buff,num);
if(strcmp(buff,"exit")==0)
{
printf("通信结束!
\n");
TCPSend(buff);
closesocket(sock1);
exit(0);
}
printf("\n");
TCPSend(buff);
}
return(0);
}
五、实验结果
图一客户端连接失败
图二服务器端搜索连接
图三客户端与服务器端建立连接
图四客户端发送信息
图五服务器端与客户端进行通信
图六通信结束
六、实验小结
客户机和服务器都是独立的计算机。
当一台连入网络的计算机向其他计算机提供各种网络服务(如数据、文件的共享等)时,它就被叫做服务器。
而那些用于访问服务器资料的计算机则被叫做客户机。
严格说来,客户机/服务器模型并不是从物理分布的角度来定义,它所体现的是一种网络数据访问的实现方式。
客户机/服务器模式将一个应用分为两个部分:
前端(客户端)、后端(服务器)。
在本次实验中用到的Socket通信的原理如下哦:
服务器端的步骤
(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。
(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。
(3)当完成通信后,服务器关闭与客户端的Socket连接。
客户端的步骤
(1)建立客户端的Socket,确定要连接的服务器的主机名和端口。
(2)发送连接请求到服务器,并等待服务器的回馈信息。
(3)连接成功后,与服务器进行数据的交互。
(4)数据处理完毕后,关闭自身的Socket连接。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)