计算机课实验三,成都信息工程学院计算机网络课程实验三

成都信息工程学院计算机网络课程实验三 本文关键词:成都,计算机网络,信息工程学院,课程,实验

成都信息工程学院计算机网络课程实验三 本文简介:计算机网络实验报告实验三:编写客户服务器程序班级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;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言#define与typedef的区别

点击蓝字关注我们在C语言编程中,typedef 和 #define是最常用语句,可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。typedef的用法在C/C语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部…

netflix_Netflix Archaius用于物业管理–基础知识

netflixNetflix Archaius提供了一组精巧的功能,可将动态属性加载到应用程序中。 这篇博客文章只是我所了解的Archaius范围的文档,比我在这里所记录的内容要多得多,但这应该提供一个很好的开始: 默认行为 考虑一个简单的属性文件…

python安装pygame模块_windows下 python 如何安装pygame模块

本机系统:win7,Pyhon版本: 3.6.0 1. 安装下载python 官网 https://www.python.org/ 下载地址 https://www.python.org/downloads/windows/ 下载后运行并安装。注意: 官网明确表示,3.5及以上版本不支持xp操作系统。要兼…

html文字添加波浪线,利用css渐变给文字下方加波浪线

具体代码如下.wavy-line-decoration {position: relative;line-height: 1.5em;}.wavy-line-decoration::before {content: ;position: absolute;bottom: -3px;width: 100%;height: 0.25em;background: // 可以给同一个元素同时添加多个背景渐变图层,用逗号隔开&…

新旧C++生成随机浮点数方法,你喜欢哪个?

点击蓝字关注我们一、在C11之前,我们通常采用rand函数来生成随机数。有时我们想用rand生成一组随机数,即使我们调用了srand,但生成的还是相同值。为什么会产生这种情况?又该如何解决?下面将用第一视角一起探究这其中的…

arm926ej_EJB超时策略:它们如何提供帮助?

arm926ejEJB 3.1在其API中引入了与超时相关的注释。 AccessTimeout StatefulTimeout 让我们快速看一下它们是什么以及它们为什么重要 AccessTimeout 指定一个排队请求(等待另一个线程完成)超时的时间段。 当您的会话bean实例被并发请求轰炸时&#…

html页面加载完成后会触发的事件_前端隐秘角落 - 页面渲染

前言如图所示,webkit内核浏览器的渲染过程(解析HTML,构建DOM树,解析CSS,构建CSSOM树 ,构建render树,布局layout,绘制painting),这些过程理解起来可能有些抽象,今天我们一…

计算机进管理提示找不到入口,win10系统开机提示xxxdll模块已加载但找不到入口点的教程...

有关win10系统开机提示xxxdll模块已加载但找不到入口点的操作方法想必大家有所耳闻。但是能够对win10系统开机提示xxxdll模块已加载但找不到入口点进行实际操作的人却不多。其实解决win10系统开机提示xxxdll模块已加载但找不到入口点的问题也不是难事,小编这里提示两…

十大经典排序,你真的都会了吗?(源码详解)

点击蓝字关注我们一、前言:排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键…

jvm 架构_不可变的基础架构,热部署和JVM

jvm 架构您是否在生产中部署和取消部署基于JVM的应用程序(无论JVM容器/无容器)? 也就是说,当您拥有某个应用程序或服务的新版本时,是否通过“取消部署”和“热部署”该应用程序的新更新版本来更改正在运行的JVM&#x…

c语言默认参数_5.1 C++有默认参数的函数

点击上方“C语言入门到精通”,选择置顶第一时间关注程序猿身边的故事作者闫小林白天搬砖,晚上做梦。我有故事,你有酒么?C有默认参数的函数在函数调用时形参从实参获取值,因为实参的个数要和形参相同,但有时…

计算机组成原理唐朔飞课后答案第六章,计算机组成原理第六章部分课后题答案(唐朔飞版)...

计算机组成原理第六章部分课后题答案(唐朔飞版) 6.4 设机器数字‎长为8位(含1位符号‎位在内),写出对应下‎列各真值的‎原码、补码和反码‎。 -13/64,29/128,100,-87 解:十进制数 二进制数 原 码 反 码 补 码 -13/64 …

jboss eap 7.0_是时候抛弃Java 7 – JBoss EAP 6.4了!

jboss eap 7.0这一周真是太棒了。 JBoss EAP 6.4已发布,在众多技术增强和新功能中 ,最大的是:Java 8已添加到受支持的配置列表中。 其中包括Oracle JDK和IBM JDK。 Java SE 7公开更新结束通知 2015年4月之后,Oracle将不再将Java …

C语言史上最愚蠢的BUG ???

点击蓝字关注我们本文来自“The most stupid C bug ever”,很有意思,分享给大家。我相信这样的bug,就算你是高手你也会犯的。你来看看作者犯的这个Bug吧。。首先,作者想用一段程序来创建一个文件,如果有文件名的话&…

python 字符串转日期_我总结的130页Python与机器学习之路V1.2.pdf,都是干货!

告别枯燥,通过学习有趣的小例子,扎实而系统的入门Python,从菜鸟到大师,个人觉得这是很靠谱的一种方法。通过一个又一个的小例子,真正领悟Python之强大,之简洁,真正做到高效使用Python.两周前发出…

大学计算机需要论文吗,大一新生刚开学,是否有必要带电脑?听听辅导员的建议,非常中肯...

原标题:大一新生刚开学,是否有必要带电脑?听听辅导员的建议,非常中肯各大高校的录取工作正在如火如荼的进行,很快考生们就能接到来自各个学校的录取通知书。对于考生来说,没有什么事情会比被心仪的大学录取…

计算机系统是连续系统,连续系统的计算机模拟

连续系统的计算机模拟 (36页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!29.9 积分 第2章 连续系统的计算机模拟本章讨论连续系统的模拟技术,由于这类系统中状态随时间连续动态地变化&…

ae合成设置快捷键_教程|AE教程第三波:必须掌握的关键帧之基础设置

该如何高效的学习AE?星驰君认为知其然还需知其所以然正确的学习顺序应该是了解核心原理,掌握基本操作,案例实战模仿比如,想要更好的掌握和运用关键帧来制作更复杂的效果。就先要知道关键帧是什么关键帧:计算机动画术语…

gradle入门_Gradle入门:集成测试

gradle入门因为Java项目的标准项目布局仅定义了一个测试目录( src / test ),所以我们没有将集成测试添加到Gradle构建中的标准方法。 如果要使用标准项目布局,则可以使用以下选项之一将集成测试添加到Gradle构建中: …

老兵精讲:高质量C语言编程的10条规范

点击蓝字关注我们C语言编码规范10条分享给大家,还是可以规避掉很多bug的!1、最重要的规则编写代码时最重要的一条规则是:检查周围的代码并尝试模仿它。作为维护人员,如果收到的补丁明显与周围代码的编码风格不同,这是令…