计算机课实验三,成都信息工程学院计算机网络课程实验三
成都信息工程学院计算机网络课程实验三 本文关键词:成都,计算机网络,信息工程学院,课程,实验
成都信息工程学院计算机网络课程实验三 本文简介:计算机网络实验报告实验三:编写客户服务器程序班级xxxxx姓名xxxxxxxxxxxxx学号xxxxxxxxx日期xxxxxxxx一、实验目的:学习TCP/UDP协议套接字编程,深入理解客户服务器程序的原理,以及端口作用等。二、实验内容编写客户服务器程序,服务器运行后等待客户连接,一旦收到客户送来的
成都信息工程学院计算机网络课程实验三 本文内容:
计算机网络
实验报告
实验三:编写客户服务器程序
班级
xxxxx
姓名
xxxxxxxxxxxxx
学号
xxxxxxxxx
日期
xxxxxxxx
一、
实验目的:
学习TCP/UDP协议套接字编程,深入理解客户服务器程序的原理,以及端口作用等。
二、
实验内容
编写客户服务器程序,服务器运行后等待客户连接,一旦收到客户送来的信息,立即回送回去。
客户机等待用户输入信息,然后发送给服务器。并接受服务器回送回来的信息。所有的信息均需显示在屏幕上。
三、
程序实现设计方法
编写客户服务器程序,服务器运行后等待客户连接,一旦收到客户送来的信息,立即送回去。
客户机等待用户输入信息,然后发送给服务器。并接受服务器回送回来的信息。所有的信息均需显示在屏幕上。
可以每2个人一组,一个负责服务器端,一个负责客户端。(自己协商使用udp还是tcp方式,端口号)
上机实验过程:
1、启动winXP,运行vc程序
2、新建一个文件,录入编辑好的服务器程序或客户程序
3、分别以server.c或client.c保存
4、打开build/compile菜单,系统会自动建立一个新的工程,然后完成编译工作
5、打开project/settings.菜单,在对话框的link标签下,找到project
options:编辑框,在其中添加“WS2_32.LIB”
6、打开build/build菜单,系统生成执行程序server.exe或client.exe
7、分别运行server.exe,client.exe,观察两个程序运行结果
四、
源程序
服务器端程序
/****************************************************Windows环境下使用VC编写的TCP通信服务器端程序在编译这个程序时,需要在工程设置项目--〉连接项目中添加如下两项:
Ws2_32.lib和Winmm.lib否则编译后链接生成可执行文件时会出错!服务器程序在单机内的测试运行方法:
server
[监听端口:缺省为9999]程序中的函数列表:int
InitSockets(void):
插口(套接字)初始化void
ServeAClient(LPVOID
lpv):为客户提供服务的函数int
ServerLoop(SOCKET
sd_listen,int
isMultiTasking):
服务器循环函数,服务期间总是在这个函数中循环********************************************************/
#include
#include
#include
/*
由于Winsock目前有两个版本:2.2和1.1,所以我们首先必须判断系统所支持的Winsock版本,这就要靠WSAStartup函数了。
另外还有一个WSACleanup函数,这两个函数是Winsock编程必须调用的,其中WSAStartup函数的功能是初始化Winsock
DLL,因为在Windows下,Socket是以DLL的形式实现的。1.1版本的DLL为Winsock.dll,而2.2版本的DLL则为Wsock32.dll,其中在2.2版本的系统中,对Winsock1.1函数的调用会由Wsock32.dll自动映射到Winsock.dll。WSAStartup函数的功能就是初始化DLL,其函数原型为:
int
WSAStartup
(WORD
wVersionRequested,LPWSADATA
lpWSAData);
其第一个参数为你所想需要的Winsock版本!低字节为主版本,高字节为副版本!由于目前Winsock有两个版本:1.1和2.2,因此该参数可以是0x101或0x202;第2个参数是一个WSADATA结构,用于接收函数的返回信息!WSAStartup函数调用成功会返回0,否则返回非0值!
由于Win
95,WinNT4自带的Winsock是1.1版本的,所以如果你的程序是基于Winsock2.2的,那很可能无法在上面运行。因此,如果你希望你写的程序被所有Windows平台支持的话,最好将其声明成1.1版的,不过这样将无法使用很多Winsock2.2才有的特性!至于WSACleanup的用法很简单,用“WSACleanup();”就行了!另外,在DLL内部维持着一个计数器,只有第一次调用WSAStartup才真正装载DLL,以后的调用只是简单的增加计数器,而WSACleanup函数的功能则刚好相反,每调用一次使计数器减1,当计数器减到0时,DLL就从内存中被卸载!因此,你调用了多少次WSAStartup,就应相应的调用多少次的WSACleanup!/
int
InitSockets(void)
{
WSADATA
wsaData;
WORD
wVersionRequested;
int
err;
/*
Ask
for
Winsock
1.1
functionality/
wVersionRequested
=
MAKEWORD(
1,1
);
err
=
WSAStartup(
wVersionRequested,if
(
err
!=
0
)
{
printf(“Error
%d:
Winsock
not
available/n“,err);
return
1;
}
return
0;
}
#define
WSA_ERROR(x)
{
printf(“Error
%d:
%s/n“,/
WSAGetLastError(),x);
return
1;
}
int
ServerLoop(SOCKET
sd_listen,int
isMultiTasking);
main(int
argc,char*argv)
{
SOCKET
sd_listen;
int
err;
u_short
iPort;
struct
sockaddr_in
addr_srv;
struct
hostentptrHost;
iPort
=
(argc
>=
2)
?
atoi(argv[1])
:
9999;//从命令行中提取服务器监控的端口号,如果命令行没有带数字格式的端口号,则定为9999
InitSockets();//初始化套接字
/*
创建套接字有两个函数,socket和WSASocket,前者是标准的Socket函数,而后者是微软对Socket的扩展函数。socket函数有3个参数,第一个是指定通信发生的区域,在UNIX下有AF_UNIX、AF_INET、AF_NS等,而在Winsock1.1下只支持AF_INET,到了2.2则添了AF_IRDA(红外线通信)、AF_ATM(异步网络通信)、AF_NS、AF_IPX等;第2个参数是套接字的类型,在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。SOCK_STREAM也就是通常所说的TCP,而SOCK_DGRAM则是通常所说的UDP,而SOCK_RAW则是用于提供一些较低级的控制的;第3个参数依赖于第2个参数,用于指定套接字所用的特定协议,设为0表示使用默认的协议。socket函数调用成功返回一个套接字描述符,错误则返回SOCKET_ERROR。/
sd_listen
=
socket(PF_INET,SOCK_STREAM,0);
if
(sd_listen
==
INVALID_SOCKET)
{
printf(“Error:
out
of
socket
resources/n“);
return
1;
}
/*
接下来要为服务器端定义的这个监听的socket指定一个地址及端口(Port),这样客户端才知道要连接哪一个地址的哪个端口,为此我们首先设置数据结构struct
sockaddr中的参数,随之调用bind()函数将socket邦定在指定的端口和地址上,该函数调用成功返回0,否则返回SOCKET_ERROR。sockaddr_in结构的sin_addr.s_addr成员被设置为INADDR_ANY,意味着由操作系统给socket自动指定一个最有效的IP地址。/
addr_srv.sin_family
=
PF_INET;
addr_srv.sin_addr.s_addr
=
htonl(INADDR_ANY);
addr_srv.sin_port
=
htons(iPort);
err
=
bind(sd_listen,(const
struct
sockaddr)
if
(err
==
INVALID_SOCKET)
WSA_ERROR(“Error:
unable
to
bind
socket/n“)
/*
当服务器端的Socket对象绑定完成之后,服务器端必须通知操作系统为这个socket建立一个监听队列来接收客户端的连接请求。listen()函数使服务器端的Socket
进入监听状态,并设定可以建立的最大连接数。该函数调用成功返回0,否则返回SOCKET_ERROR。/
err
=
listen(sd_listen,SOMAXCONN);
if
(err
==
INVALID_SOCKET)
WSA_ERROR(“Error:
listen
failed/n“)
//程序进入服务循环函数
ServerLoop(sd_listen,1);
printf(“Server
is
down/n“);
WSACleanup();
return
0;
}
/*
如果客户端发来HELLO
SERVER,
那么服务器端将回送HELLO
CLIENT,
不符合的输入,服务器端将没有响应/
void
ServeAClient(LPVOID
lpv)
{
SOCKET
sd_accept
=
(SOCKET)
lpv;
const
charmsg
=
“HELLO
CLIENT“;
char
response[4096];
memset(response,0,sizeof(response));
recv(sd_accept,response,sizeof(response),0);
if
(strcmp(response,“HELLO
SERVER“))
{
printf(“Application:
client
not
using
expected
““protocol
%s/n“,response);
}
else
send
(sd_accept,msg,strlen(msg)+1,0);
closesocket(sd_accept);
}
#define
MAX_SERVED
3
//服务器端的循环函数,服务期间总是在这个函数中运行
int
ServerLoop(SOCKET
sd_listen,int
isMultiTasking)
{
SOCKET
sd_accept;
struct
sockaddr_in
addr_client;
int
err,nSize;
int
numServed
=
0;
HANDLE
handles[MAX_SERVED];
int
myID;
//主循环体,服务期间总是在这个结构内循环
while
(numServed
#include
int
InitSockets(void)
{
WSADATA
wsaData;
WORD
wVersionRequested;
int
err;
/*
Ask
for
Winsock
1.1
functionality/
wVersionRequested
=
MAKEWORD(
1,1
);
err
=
WSAStartup(
wVersionRequested,if
(
err
!=
0
)
{
printf(“Error
%d:
Winsock
not
available/n“,err);
return
1;
}
return
0;
}
#define
WSA_ERROR(x)
{
printf(“Error
%d:
%s/n“,/
WSAGetLastError(),x);
return
1;
}
//void
InitSockets(void);
main(int
argc,char*argv)
{
SOCKET
sd_client;
int
err;
u_short
iPort;
struct
sockaddr_in
addr_srv;
struct
hostentptrHost;
char
response[4096];
charpszHost;
charmsg
=
“HELLO
SERVER“;
if
(argc
==
3)
{
pszHost
=
argv[1];
iPort
=
atoi(argv[2]);
}
else
{
printf(“Usage:/t
client1
[hostname]
[portno]“);
return
1;
}
InitSockets();
sd_client
=
socket(PF_INET,SOCK_STREAM,0);
if
(sd_client
==
INVALID_SOCKET)
WSA_ERROR(“no
more
socket
resources“)
//输入了数字格式的主机名,则直接转换,否则通过gethostbyname获取主机IP
if
(atoi(pszHost))
{
u_long
ip_addr
=
inet_addr(pszHost);
ptrHost
=
gethostbyaddr((char)
}
else
ptrHost
=
gethostbyname(pszHost);
if
(!ptrHost)
WSA_ERROR(“cannot
resolve
hostname“)
addr_srv.sin_family
=
PF_INET;
memcpy((char)
addr_srv.sin_port
=
htons(iPort);
//向服务器发出连接请求
err
=
connect(sd_client,(struct
sockaddr)
if
(err
==
INVALID_SOCKET)
WSA_ERROR(“cannot
connect
to
server“)
printf(“You
are
connected
to
the
server/n“);
//连接上后,向服务器发出服务请求
send
(sd_client,msg,strlen(msg)+1,0);
memset(response,0,sizeof(response));
//接收服务器返回的服务信息
recv(sd_client,response,sizeof(response),0);
printf(“server
says
%s/n“,response);
closesocket(sd_client);
WSACleanup();
return
0;
}
计算机课实验三,成都信息工程学院计算机网络课程实验三相关推荐
- 计算机网络安全期末考试题成都信息工程大学,计算机网络术基础(考试).成都信息工程学院.doc...
计算机网络术基础(考试).成都信息工程学院 成都信息工程学院考试试卷 2009--2010学年第一学期 课程名称:<计算机网络技术基础> 使用班级: 行管.工程 试题一二三四五总 分得分单 ...
- 计算机专业基础考806,成都信息工程学院
考研是一场持久战,在成都信息工程学院806计算机基础考研复习的过程中,难免会遇到各种各样的问题和挑战.在进入强化冲刺阶段之后,高强度的学习和心里压力更是让很多学子身心疲惫!如何少走弯路,及时解决这些问 ...
- 2011年成都信息工程学院第二季极客大挑战逆向第三题Game破文
[文章标题]: 2011年成都信息工程学院第二季极客大挑战逆向第三题Game破文 [文章作者]: JoyChou [软件名称]: Game [软件大小]: 176KB [下载地址]: http://w ...
- 计算机网络技术移动互联,信息工程学院计算机网络技术专业、移动互联应用技术专业顺利召开2019级新生专业介绍会...
原标题:信息工程学院计算机网络技术专业.移动互联应用技术专业顺利召开2019级新生专业介绍会 俗话说:"良好的开端是成功的一半".为帮助大一新生开创一个良好的开端.让他们尽快适应大 ...
- 成都信息工程大学c语言题库,成都信息工程学院C语言考试题及答案.docx
成都信息工程学院C语言考试题及答案 编写一程序P111.C实现以下功能 x(x只考虑整数int且必须定义为int.但F(x)完全可能超过int的表示范围)通过键盘输入(输入前给出提示Please?in ...
- 信息与计算机工程学院英文翻译,成都信息工程学院通信工程学院英文翻译.doc...
成都信息工程学院通信工程学院英文翻译.doc 成都信息工程学院通信工程学院 本科毕业论文设计 英文→中文 翻译 论文题目红外光通信系统设计姓 名邓谋专 业通信工程班 级2010级一班学 号201010 ...
- 计算机网络课程设计 文华学院,计算机网络课程设计-校园网的组建与设计.doc
计算机网络课程设计-校园网的组建与设计 华中科技大学文华学院 计算机网络课程设计报告书 课程名称:校园网的组建与设计 学 部:信息科学与技术学部 专业班级:软件工程2009级(1)班 指导教师: 廖剑 ...
- 计算机网络课程实验---使用思科PT进行拓扑网络搭建并ping通
计算机网络课程实验-使用思科PT进行拓扑网络搭建并ping通 Ⅰ.实验目标 ①结果体现: 设计如图的网络,并进行IP地址和路由表的配置.最终要求路由器的每个端口对应一个子网:要求的子网地址为:xx.y ...
- 808计算机基础考试时间,成都信息工程大学808计算机基础2020年考研大纲
成都信息工程大学808计算机基础2020年考研大纲已发布,文都考研网做如下整理,快随小编来看下吧~ 一.科目的总体要求 要求考生掌握并理解计算机基础知识.硬件体系结构.计算机软件基本知识.程序设计的基 ...
最新文章
- Facebook如何运用机器学习进行亿级用户数据处理
- 据说程序员等电梯的时候都想过调度算法
- 答与微博前端教主在吃饭时讨论到的一道微软面试题
- 二叉树的直径—leetcode543
- java二维数组合并_java怎么合并二维数组
- java常用类介绍及源码阅读(ArrayList)
- 手指甲上的月牙辨健康,月牙会“丢”也能“长回来”
- Windows下Git的下载与安装
- 经典算法(1)- 求1到N的质数
- 数据采集无线网服务器软件,WIFI智能数据盒
- Vue.js目录结构
- Android中使用ShareSDK功能学习
- Ubuntu使用——9(搜狗输入法安装)
- python实现拼多多自动回复_拼多多客服多开工具怎么配置多店铺客服?
- 记录--前端路由 hash 与 history 差异
- Deepin 深度操作系统安装教程
- DataCastle员工离职预测数据竞赛个人总结
- excel替换固定sql中的某个值实现批量导入
- esc键 qt 退出菜单_Qt中Esc键触发事件处理
- 线性单节锂电充电IC
热门文章
- Java整数缓存-为什么Integer.valueOf(127)== Integer.valueOf(127)为True
- how2java_HOW-TO:在Spring 4和Java 7中使用@PropertySource批注
- 在Java 8之前,您编写了几行代码来对对象集合进行排序?
- 使用一个命令执行单个Java源文件
- 26.0.0-alpha1_WildFly 8.0.0.Alpha1的发布和一些历史
- drools。drools_Drools Planner重命名为OptaPlanner:宣布www.optaplanner.org
- 如何将自定义数据源集成到Apache Spark中
- 存根类 测试代码 java_有关为旧版代码创建存根的更多信息–测试技术7
- Neo4j 2.1:传递节点ID与UNWIND
- 在Spring MVC Web应用程序中添加社交登录:集成测试