实验七简单的服务器客户端程序实验报告.docx
- 文档编号:4719748
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:17
- 大小:193.29KB
实验七简单的服务器客户端程序实验报告.docx
《实验七简单的服务器客户端程序实验报告.docx》由会员分享,可在线阅读,更多相关《实验七简单的服务器客户端程序实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
实验七简单的服务器客户端程序实验报告
系别
计算机系
班级
B120503
学号
B12050316
姓名
段浴
课程名称
计算机网络
实验日期
2014/11/8
实验名称
简单的客户 /服务器程序设计与实现
成绩
实验目的:
1、熟悉 Microsoft Visual Studio 2008 编程环境。
2、了解 TCP 与 UDP 协议,以及它们之间的区别。
3、了解客户/服务器模型原理。
4、熟悉 Socket 编程原理,掌握简单的套接字编程。
实验条件:
硬件:
PC 机(两台以上)、网卡、已经设定好的以太网环境
软件:
Microsoft Visual Studio 2008
实验原理:
1、编写用 TCP 协议实现的 Client 端和 Server 端程序并调试通过。
Socket()建立流式套接字,返回套接字号。
客户方
bind(),套接字 s 与本地地址相连。
Socket(),建立流失套接字,
listen(),通知 TCP,服务器准备好接收连接。
返回套接字号
accept(),接受连接,等待客户端的连接... connect(),将套接字 s 与远
地主机连接
连接建立,accept()返回,得到新的套接字,sc
recvt()/send(),在套接字 sc 上读/写数据,直到 send()/recv(),在套接字上读
数据交换完毕 /写数据,直到数据交换完
closesocket(),关闭套接字 sc closesocket(),关闭套接字
结束 TCP 对话
closesocket(),关闭最初套接字 s,服务结束
洛阳理工学院 实验报告
1 / 10
程序分两部分:
客户程序和服务器程序。
工作过程是:
服务器首先启动,它创建套接字之后等待客户的连接;客户启动后
创建套接字,然后和服务器建立连接;建立连接后,客户接收键盘输入,然后将
数据发送到服务器,服务器收到到数据后,将接收到的字符在屏幕上显示出来。
或者服务器接收键盘输入,然后将数据发送到客户机,客户机收到数据后,将接
收到的字符在屏幕上显示出来。
2、编写用 UDP 协议实现的 Client 端和 Server 端程序并调试通过(做完第一个实验的
基础上做该实验)。
服务器方客户方
Socket()建立流式套接字,返回套接字号。
bind(),套接字 s 与本地地址相连。
recvt()/send(),在套接字上读/写数据,直到数据
交换完毕
closesocket(),关闭套接字
Socket(),建立流失套接字,
返回套接字号
将套接字与远地主机连接
send()/recv(),在套接字上读
/写数据,直到数据交换完
closesocket(),关闭套接字
结束 UDP 对话
3、编写用 TCP 协议实现 Client 端与 Server 端的一段对话程序。
Server 端根据用户的
输入来提示 Client 端下一步将要进行操作。
2 / 10
实验内容:
Sever 端代码:
// server.cpp :
定义控制台应用程序的入口点。
#include
#include
#include
#include
#pragma comment(lib, "WS2_32")
SOCKET sock1,sock2;
int sin_size ;
struct sockaddr_in my_addr,their_addr;
char name[20];
//初始化函数 Tcp
void Init()
{
printf("\n\n\nServer:
TCP\n\n\n");
//建立套接字
const WORD wMinver=0x0101;
WSADATA wsadata;
if(0!
=:
:
WSAStartup(wMinver,&wsadata))
perror("Start socket error!
");
if(INVALID_SOCKET==(sock1=:
:
socket(AF_INET,SOCK_STREAM,0)))
perror("Create socket error!
");
my_addr.sin_family=AF_INET;
my_addr.sin_addr.S_un.S_addr=INADDR_ANY;
my_addr.sin_port=htons(1000);
if(SOCKET_ERROR==:
:
bind(sock1,(struct sockaddr*)&my_addr,sizeof(my_addr)))
{
perror("Binding stream socket");
exit
(1);
}
//开始侦听
if(SOCKET_ERROR==:
:
listen(sock1,5))
{
perror("Listening stream socket");
exit
(1);
3 / 10
}
//接受连接
printf("Ready to serve client. Please connect...\n\n\n");
sin_size = sizeof(struct sockaddr_in);
if((sock2=accept(sock1,(struct sockaddr *)&their_addr,&sin_size))==-1)
{
perror("Accepting stream socket");
exit
(1);
}
printf("Accepting a new connet:
%s",inet_ntoa(their_addr.sin_addr));
}
//选择菜单
int menu()
{
char *s=(char*)malloc(2*sizeof(char));
int c;
printf("\n\n\nServer:
Menu\n\n\n");
printf("*********************************\n\n");
printf("*1.SendMessage*\n");
printf("*2.ReceiveMessage*\n");
printf("*3.Exit*\n\n");
printf("*********************************\n");
do
{
printf("\nEnter your choice:
");
gets(s);
if(s[0]=='\0'){
gets(s);
}
c=atoi(s);
}while(c<0||c>3);
free(s);
return c;
}
//消息发送函数
void Send()
{
char Msg[10240];
printf("\nPlease Input the message:
");
gets(Msg);
Msg[10239]='\0';
4 / 10
:
:
send(sock2,Msg,strlen(Msg),0);
}
//消息接收函数
void Receive()
{
int len;
char buf[10240];
for(int i=0;i<10240;i++){
buf[i]='\0';
}
if((len=:
:
recv(sock2,buf,10240,0))==-1)
{
perror("Receving data error");
exit
(1);
}
printf("The Received Message:
%s\n",buf);
}
//主函数
void main()
{
Init();
for(;;)
{
switch(menu())
{
case 1:
Send();
break;
case 2:
Receive();
break;
case 3:
exit(0);
}
}
//:
:
closesocket(sock2);
:
:
closesocket(sock1);
5 / 10
:
:
WSACleanup();
}
Client 端代码:
// client.cpp :
定义控制台应用程序的入口点。
//
#include
#include
#include
#include
#pragma comment(lib, "WS2_32")
SOCKET sock1,sock2;
int sin_size ;
struct sockaddr_in my_addr,their_addr;
char name[20];
//初始化函数 Tcp
void Init()
{
printf("\n\n\nClient:
TCP\n\n\n");
//建立套接字
const WORD wMinver=0x0101;
WSADATA wsadata;
if(0!
=:
:
WSAStartup(wMinver,&wsadata))
perror("Start socket error!
");
if(INVALID_SOCKET==(sock1=:
:
socket(AF_INET,SOCK_STREAM,0)))
perror("Create socket error!
");
my_addr.sin_family=AF_INET;
my_addr.sin_addr.S_un.S_addr=inet_addr("192.168.93.48");
my_addr.sin_port=htons(1000);
//请求连接
printf("connecting...");
sin_size = sizeof(struct sockaddr_in);
if(sock2=(:
:
connect(sock1,(LPSOCKADDR)&my_addr,sin_size))==-1)
{
perror("Accepting stream socket");
exit
(1);
}
}
6 / 10
//选择菜单
int menu()
{
char *s=(char*)malloc(2*sizeof(char));
int c;
printf("\n\n\nClient:
Menu\n\n\n");
printf("
*********************************\n\n");
printf("*1.SendMessage
*\n");
printf("*2.ReceiveMessage
*\n");
printf("*3.Exit
*\n\n");
printf("
*********************************\n");
do
{
printf("\nEnter your choice:
");
gets(s);
if(s[0]=='\0'){
gets(s);
}
c=atoi(s);
}while(c<0||c>3);
free(s);
return c;
}
//消息发送函数
void Send()
{
char Msg[10240];
printf("\nPlease Input the message:
");
gets(Msg);
Msg[10239]='\0';
:
:
send(sock1,Msg,strlen(Msg),0);
}
//消息接收函数
void Receive()
{
7 / 10
int len;
char buf[10240];
for(int i=0;i<10240;i++){
buf[i]='\0';
}
if((len=:
:
recv(sock1,buf,10240,0))==-1)
{
perror("Receving data error");
exit
(1);
}
printf("The Received Message:
%s\n",buf);
}
//主函数
void main()
{
Init();
for(;;)
{
switch(menu())
{
case 1:
Send();
break;
case 2:
Receive();
break;
case 3:
exit(0);
}
}
:
:
closesocket(sock2);
:
:
closesocket(sock1);
:
:
WSACleanup();
}
8 / 10
实验结果
Server 端界面:
发送信息
Server 端界面:
接收信息
9 / 10
实验总结
在老师的精心指导和自己的努力下最终成功完成了本次的实验内容,虽然在
过程中遇到好多问题,在老师和同学们的帮助下最后顺利完成。
在此试验中通过
老师的讲解和自己的动手操作, 通过本次实验我了解了一些 路由器的基本配置 ,
也学会使用了 子网划分的一些基本知识 ,对计算机网络的学习更加感兴趣。
10 / 10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 简单 服务器 客户端 程序 报告