西工大计算机网络实验三
西工大模电实验报告

2014模拟电子实验总结报告计算机学院姓名:刘凯目录实验一:晶体管单级放大器 (3)一、实验目的 (3)二、实验原理 (3)三、实验内容 (4)四、实验结果 (5)实验二:多级负反馈放大器的研究 (6)一、实验目的 (6)二、实验原理 (6)三、实验内容 (10)四、实验结果 (11)实验三:功率放大器 (17)一、实验目的 (17)二、实验原理 (17)三、实验内容 (18)四、实验结果 (19)实验四:RC文氏电桥振荡器 (23)一、实验目的 (23)二、实验原理 (23)三、实验内容 (24)四、实验结果 (25)实验五:有源滤波器 (26)一、实验目的 (26)二、实验原理 (26)三、实验内容 (27)四、实验结果 (28)实验六:电压比较器与矩形波发生器 (29)一、实验目的 (29)二、实验原理 (29)三、实验内容 (31)四、实验结果 (32)实验七: (35)一、实验目的 (35)二、设计要求 (35)三、实验原理 (35)四、电路设计 (39)五、电路元器件选择 (39)六、实验结果 (40)七、注意事项 (41)实验一:晶体管单级放大器一、实验目的(1)掌握晶体管放大器静态工作点的测试和调整方法,观察静态工作点的对放大器输出的影响(2)测量放大器的放大倍数、输出电阻,输入电阻二、实验原理实验电路如图所示,采用基极固定分压式偏置电路。
电路在接通直流电源Vcc而未加入信号(Vi=0)时,三极管三个极电压和电流称为静态工作点即1、放大器静态工作点的选择和测量放大器的基本任务是不失真的放大小信号。
为了获得最大不失真输出电压,静态工作点应选在输出特性曲线上交流负载线的中点。
若工作点选的太高,则容易引起饱和失真,而选的太低,又易引起截止失真。
静态工作点的测量是指在接通电源电压后放大器输入端不加信号时,测量晶体管的集电极电流ICQ和管压降VCEQ。
其中VCEQ可直接用万用表直流电压档测C-E,极间的电压既得,而ICQ的测量则有直接法和间接法两种:(1)直接法:将万用表电流档串入集电极电路直接测量。
西工大信号与系统上机实验3

上机实验3 连续LTI 系统的频域分析 一、实验目的 (1)掌握连续时间信号傅立叶变换和傅立叶逆变换的实现方法,以及傅立叶变换的时移特性,傅立叶变换的频移特性的实现方法; (2)了解傅立叶变换的特点及其应用; (3)掌握函数fourier 和函数ifourier 的调用格式及作用; (4)掌握傅立叶变换的数值计算方法,以及绘制信号频谱图的方法。
二、实验内容与方法1.验证性实验(1)傅立叶变换。
已知连续时间信号()2t f t e -=,通过程序完成()f t 的傅立叶变换。
MATLAB 程序:syms t;f=fourier(exp(-2*abs(t)));ezplot(f);运行结果如下:试画出()()323t f t e U t -=的波形及其幅频特性曲线。
MATLAB 程序:Syms t v w ff=2/3*exp(-3*t)*sym(‘Heaviside(t)’);F=fourier(f);subplot(2,1,1);ezplot(f);subplot(2,1,2);ezplot(abs(F));信号()()323t f t e U t -=的波形及其幅频特性曲线如图所示:(2)傅立叶逆变换。
已知()211f t ω=+,求信号()F j ω的逆傅立叶变换。
MATLAB 程序:syms t wifourier(1/(1+w^2),t)结果如下:()()()()11*exp **exp *22ans t U t t U t =-+ (3)傅立叶变换数值计算。
已知门函数()()()()211f t g t U t U t ==+--,试采用数值计算方法确定信号的傅立叶变换()F j ω。
MATLAB 程序:R=0.02;t=-2:R:2;f=stepfun(t,-1)-stepfun(t,1);W1=2*pi*5;N=500;k=0:N;W=k*W1/N;F=f*exp(-j*t'*W)*R;F=real(F);W=[-fliplr(W),W(2:501)];F=[fliplr(F),F(2:501)];subplot(2,1,1);plot(t,f); axis([-2,2,-0.5,2]);xlabel('t');ylabel('f(t)'); title('f(t)=U(t+1)-U(t-1)');subplot(2,1,2);plot(W,F); axis([-40,40,-1,2]);title('f(t)的傅立叶变换');ylabel('F(w)');xlabel('w');信号的傅立叶变换如图:(4)连续函数的傅立叶变换。
西工大计算机网络作业3

1.当两台计算机分别和中继器、二层交换机、三层交换、路由器相连时,请分别画出计算机与交换设备五层参考模型;计算机1上图为计算机和路由器连接.。
三层交换机与上图连接相同。
二层路由器与计算机连接只经过数据链路层和物理层,中继器与计算机连接只经过物理层。
2.学习SOCKET编程,写出TCP、UDP通信流程;将实例程序两个同学一组,实现两台计算机之间通信。
并写出学习报告;TCP通信流程客户端服务器UDP通信流程客户端服务端利用socket实现TCP,UDP通信的流程如上图所示。
SOCKET实验报告一.实验目的学习SOCKET编程,理解计算机通信的流程,分别实现TCP,UDP协议下两台计算机之间的通信。
Socket编程机制客户端:(1)客户端程序在运行后,首先需要使调用WSAStartup 函数,确保进程加载socket 应用程序所必须的环境和库文件,如Ws2_32.dll。
(2)调用函数Socket 创建SOCKET,在创建时需指定使用的网络协议、连接类型等。
(3)填充SOCKADDR 结构,指定服务端的地址、端口等。
(4)调用connect 函数连接到服务端。
(5)如果连接成功,就可以使用send 和recv 函数发送和接收数据。
(6)在数据传输完成后,可调用closesocket 函数关闭Socket。
(7)调用WSACleanup 函数释放资源。
服务端:(1)程序在运行后,首先需要使调用WSAStartup 加载Ws2_32.dll。
(2)调用函数socket 创建用于监听的SOCKET,在创建时需指定使用的网络协议、连接类型等。
(3)1 调用bind 函数将Socket 绑定到网络地址和端口。
(4)调用listen 函数开始监听。
(5)调用accept 函数等待客户端连接。
在客户端连接后,accept 函数返回,得到连接Socket。
在accept 函数返回后,可立即再调用,以处理其他客户端的连接。
西北工业大学计算机网络实验报告3

题目:1、修改udp实验程序完成两台电脑通讯2、修改tcp实验程序完成两台电脑通讯3、修改IP源代码实现只调用一个函数**: ***学号:**********班号:10011303时间:2015-12-25计算机学院目录摘要1 目的 .................................................... 错误!未定义书签。
2 要求 (1)3 相关知识 (1)4 实验内容及过程................................. 错误!未定义书签。
5参考文献 .. (4)1、实验目的1.学习UDP和TCP及IP的通讯原理。
2.掌握Socket的编程方法。
3.培养学生自己的创新实验的能力。
4、训练修改实验代码能力。
2、实验要求1、熟悉UDP和TCP通讯的原理及socket编程。
2、自己修改UDP和TCP协议代码中的错误部分,完成两台电脑之间通讯。
3、修改IP源代码使所有外部调用函数都放在一个主函数里面。
3、相关知识1、UDP协议UDP协议[2]的全称是用户数据包协议[3],在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
在OSI模型中,在第四层——传输层,处于IP协议的上一层。
UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。
UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在现在,UDP仍然不失为一项非常实用和可行的网络传输层协议。
与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。
根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP协议的主要作用是将网络数据流量压缩成数据包的形式。
西工大机电学院上机实习实验报告

C 语言上机实习2. C 基本程序设计与调试 2.1使用选择结构的程序设计 【实验目的】1. 进一步掌握各种表达式的使用。
2. 利用if 语句实现选择结构。
3. 利用switch 语句实现多分支选择结构。
【实验内容】1. 计算下列分段函数值:其他及且且321003-01656)(222≠≠<<=≠<⎪⎩⎪⎨⎧--+--+=x x x x x x x x x x x x f具体要求如下:1) 用if 语句实现分支。
2) 用scanf 函数输入,且输入前输入后有提示。
【算法与流程图】算法:采用分支结构,根据x 的不同范围进行对应的函数运算。
流程图如下:开始x<0且x ≠-30<=x<10且x ≠3及x ≠2f(x)=x²+x-6f(x)=x²-5x+6f(x)=x²-x-1输出F(x)结束输入x否是否是【程序清单】#include <stdio.h> int main() { float x,y; printf("x="); scanf("%f",&x);if ((x<0)&&(x!=-3)){y=x*x+x-6;}else if ((x>=0)&&(x<10)&&(x!=2)&&(x!=3)){y=x*x-5*x+6;}elsey=x*x-x-1;printf("f(x)=%f",y);}【运行结果】【调试分析和体会】题目考查了选择结构分支语句。
2.2循环结构的程序设计【实验目的】1.进一步练习选择结构的程序设计及实现循环结构的三种方法。
2.练习并掌握选择结构与循环结构的嵌套,调试与修改程序。
【实验内容】1.计算并输出500以内最大的10个素数及其之和。
具体要求如下:1)输出要有文字说说明,并同时输出各素数。
计算机网络实验3报告

实验报告姓名:XX学号:201430XXXX班级:1001XXXX指导教师:XXXX时间:2016.11.161.实验名称SOCKET编程2.实验目的实现两台计算机之间TCP/UDP通信(1)在一台机器上同时运行客户端和服务器端;(2)在两台PC上分别运行客户端和服务器端;3.实验原理Socket 是应用程序进程和运输层协议之间的接口。
Socket 其实是一个API,源IP 地址和目的IP 地址以及源端口号和目的端口号的组合称为套接字。
其用于标识客户端请求的服务器和服务。
它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP 地址,本地进程的协议端口,远地主机的IP 地址,远地进程的协议端口。
TCP 通信流程:TCP 是面向连接的协议,通信的双方必须事先建立连接,才能进行通信。
在通信时,服务器和客户端之间仿佛有一个管道,当通信结束时,管道才会断开。
双方都是将数据以流的形式送入管道。
具体流程如下图所示。
1) 两个进程之间没有进行初始握手,因此socket 编程时不需要建立“欢迎”套接字;2) 没有流与套接字相关联;3) 发送主机将目的IP 地址和端口号与它发送的每批字节相联系,形成分组;4) 接收进程必须拆开每个所接收到的分组,获取该分组的字节信息。
5) UDP 提供的是尽力而为的不可靠服务,而TCP 提供的是可靠服务。
4.实验方法及具体步骤首先查看客户端和服务端电脑的IP 地址,win+R,输入>>cmd>>ipconfig 查询ip地址如下图所示:将客户端和服务器端分别填上对方的IP地址用 TCP 通信,客户端发送消息,服务器端接收消息:用UDP 通信,客户端发送消息,服务器端接收消息:5.实验中遇到的问题1.老师给的代码有些问题,比如#include<iostream>写成#include<iostream.h>,用coodblocks打开发现Break 少写分号,用VS2015 试了一下,会自动添加,并没有出错,Main函数返回值写成老式写法,返回void,改为返回int。
西工大《信号与系统》实验报告

西北工业大学信号与线性系统实验报告学院:班级:姓名学号:实验一 常用信号的分类与观察一、实验内容观察常用信号的波形特点及其产生方法;使用示波器对常用波形测量参数;掌握JH5004信号产生模块的操作;对于一个系统特性的研究,其中重要的一个方面是研究它的输入输出关系,即在一特定输入信号下,系统对应的输出响应信号。
因而对信号的研究是对系统研究的出发点,是对系统特性观察的基本手段与方法。
在本实验中,将对常用信号和特性进行分析、研究。
信号可以表示为一个或多个变量的函数,在这里仅对一维信号进行研究,自变量为时间。
常用的信号有:指数信号、正弦信号、指数衰减正弦信号、复指数信号、Sa (t )信号、钟形信号、脉冲信号等。
1、 指数信号:指数信号可表示为at Ke t f =)(。
对于不同的a 取值,其波形表现为不同的形式,如下图所示:在JH5004“信号与系统”实验平台的信号产生模块可产生a<0,t>0的at ke函数的波形。
通过示波器测量输出信号波形,测量at ke 函数的a 、K 参数。
2、 正弦信号:其表达式为)sin()(θ+⋅=t w K t f ,其信号的参数有:振幅K 、角频率w 、与初始相位θ。
其波形如下图所示:通过示波器测量输出信号测量波形,测量正弦信号的振幅K 、角频率w 参数。
3、 指数衰减正弦信号:其表达式为⎩⎨⎧><=-)0()0(0)(t Ke t t f at ,其波形如下图:4、 复指数信号:其表达式为)sin()cos()()(wt e jK wt e K e K e K t f t t t jw st ⋅⋅+⋅⋅=⋅=⋅=+σσσ一个复指数信号可分解为实、虚两部分。
其中实部包含余弦衰减信号,虚部则为正弦衰减信号。
指数因子实部表征了正弦与余弦函数振幅随时间变化的情况。
一般0<σ,正弦及余弦信号是衰减振荡。
指数因子的虚部则表示正弦与余弦信号的角频率。
西工大计算机实习报告

计算机实习报告一、趣味题彩色的圆环:分析图形可知,一共有 n 个同心圆,外面大圆 n 等分,然后从每个等分点作全部同心圆的两条切线。
如果用极坐标表达,能够很容易求解切点,代码以下所示:n=10; %同心圆数量m=40; %等分点数R=1; %外圆半径s=0:0.01*pi:2*pi; %控制圆的光滑程度的极坐标角度t=0:2*pi/m:2*pi; %等分点极坐标角度x0=R*cos(t);y0=R*sin(t); %等分点直角坐标color=['b','r','c','g','m','y']; %画图颜色lc=length(color); %颜色数量长度,超出后从头开始for i=1:n %开始同心圆循环r=R/n*i; %现在同心圆半径a=acos(r/R); %切线与圆心线角度(弧度制)x1=r*cos(t-a);y1=r*sin(t-a); %任意等分点相对现在同心圆的第一种切点x2=r*cos(t+a);y2=r*sin(t+a); %任意等分点相对现在同心圆的第二个切点plot(r*cos(s),r*sin(s),color(mod(i,lc)+1));hold on; %画同心圆for j=1:m %对每一种等分点循环plot([x0(j),x1(j)],[y0(j),y1(j)],color(mod(i,lc)+1));hold on;%第一条切线plot([x0(j),x2(j)],[y0(j),y2(j)],color(mod(i,lc)+1));hold on;%第二条切线endendaxsi equal;%横纵坐标比例一致实验绘图成果以下图所示:二、算法题求无向图的最短途径(D i j k s t r a算法):实验原理分析、原理及代码以下所示(此实验代码不仅包含了实验所规定的求带权无向图最短途径,我还拓展了求有向、无向、带权有向图最短途径的内容):#i n c l u d e<i o s t r ea m>#i n c l u d e<i o m a n i p>u s i n g namespace s t d;#d e f i n e w u q i o n g0class tu{p u b li c:i n t c h a z h a o(i n t);//查找v o i d z j d i n gd i a n(i n t x);//增加顶点t u();v o i d z e n g j i a();//控制增加弧边和点v o i d z j hu b i a n();//增加弧边v o i d b i a n li();//控制遍历v o i d s h e n d u(i n t );//深度v o i d g u a n gd u(i n t );//广度v o i d j i n d u i(i n t );//进队列i n t c hudu i();//出对了boo l p a n k on g();//判空//上面全部的函数与邻接矩阵有关v o i d z x go u z a o();//初始化与最小路劲有关的东东v o i d z x s hu c hu();//求 S 中的最小路劲p r i va t e:i n t k i nd; //类图;i n t l e ng t h;// 顶点个数i n t *d i n gd i a n;//顶点i n t *j u z h e n;//矩阵i n t nu m;//最大顶点数目i n t*v i s t e d;//访问状况i n t *d u ili e;//模拟队列i n t d u i c h a n g;//队列长度//上面全部的变量与邻接矩阵有关i n t*s;//寄存现在顶点i n t s l e n g t h;//现在顶点的长度i n t*d i s t;//寄存最小路劲i n t*p r e;//寄存路劲;i n t*f i n a l;//寄存顶点};t u::t u()//初始化图{cout<<"请输入图的种类1:有向.2:无向.3:带权有向.4:带权无向"<<e n d l;//图的种类c i n>>k i n d;cout<<"请输入图的顶点数目"<<e n d l;//为顶点赋值c i n>>nu m;d i n gd i a n = new i n t[nu m];//为顶点分派内存保存j u z h e n =new i n t[nu m*nu m];//产生矩阵i f(k i n d==1||k i n d==2)//为无权图初始化矩阵{f o r(i n t i =0;i<nu m*nu m;i++)j u z h e n[i]= 0;}else//有权图初始化矩阵{f o r(i n t i =0;i<nu m*nu m;i++)j u z h e n[i]= w u q i on g;}l e n g t h = 0;}//增加顶点v o i d t u::z j d i n gd i a n(i n t x){i f(c h a z h a o(x)!=-1||l e n g t h==nu m)cout<<"图内有此顶点或图内无空间可插入,插入失败"<<e nd l;else{d i n gd i a n[le n g t h]= x;l e n g t h++;}}//增加边v o i d t u::z j hu b i a n(){i n t i;//弧头i n t j;//弧尾i f(k i n d==1||k i n d==2)//无权图{cout<<"请输入弧的头和尾"<<e n d l;c i n>>i>>j;i f(k i n d== 1)//有向图{j u z h e n[i*nu m+j]=1;}else//无向图,两边同时取值{j u z h e n[i*nu m+j]=1;j u z h e n[j*nu m+i]=1;}}else//权值,同上,将 1 改为 K(权值)即可{i n t k;c i n>>i>>j>>k;i f(k i n d== 3){j u z h e n[i*nu m+j]=k;}else{j u z h e n[i*nu m+j]=k;j u z h e n[j*nu m+i]=k;}}}//查找,将该数所在位置返回,若无则返回-1i n t t u::c h a z h a o(i n t x){f o r(i n t i =0;i<l e ng t h;i++)if(x == i)return i;return -1;}//控制遍历函数v o i d t u::b i a n li()//遍历函数{cout<<"该图的邻接矩阵为:";i n t i;int j;f o r(i=0;i<l e ng t h;i++)//将矩阵输出{c o u t<<e nd l;f o r(j=0;j<l e ng t h;j++)c o u t<<s e t w(6)<<j u z h e n[i*l e n g t h+j]<<" ";}c o u t<<e nd l;v i s t e d =new i n t[l e ng t h];//为设立访问状态定义内存空间cout<<"深度搜索:";f o r(i=0;i<l e ng t h;i++)//全部初始化为 0 即未访问状态v i s t e d[i]=0;s h e n d u(0);//将0作为0点运用深度访问函数c o u t<<e nd l;cout<<"广度搜索:";f o r(i=0;i<l e ng t h;i++)//重新设立访问状态v i s t e d[i]=0;d u ili e= new i n t[le ng t h+1];d u ili e[0]=-1;//队列初始化d u i c h a n g=0;g u a n gd u(0);//将0作为0点运用广度访问函数}//深度遍历v o i d t u::s h e n d u(i n t x)//采用递归的手法{i n t p;v i s t e d[x]=1;//访问后置 1 避免重复访问cout<<x<<"";p = x*l e n g t h+1;w h il e(p%l e n g t h!=0){i f(j u z h e n[p]!=0&&v i s t e d[p%l e n g t h]!=1)s h e n d u(p%l e n g t h);p++;}}//广度遍历v o i d t u::g u a n gd u(i n t x){i n t p;v i s t e d[x]=1;cout<<x<<"";p=l e n g t h*x+1;w h il e(p%l e n g t h!=0)//没有遍历属于根节点的后裔的全部兄弟结点加入到队列中(这样能够先进先出,后来的子代加入后也是先输出父亲结点){i f(j u z h e n[p]!=0&&v i s t e d[p%l e n g t h]!=1){v i s t e d[p%l e n g t h]=1;//判断与否已经加入队列或访问j i n d u i(p%l e n g t h);}p++;//进行下一种判断}w h il e(p a n k on g())//加入全部的子代兄弟节点后现在出队列并且访问,访问的方式一致会访问后优先加入其子代结点然后出队列访问{g u a n gd u(c hu d u i());}}//进队列,在队头插入一种函数,这个出队入队为了广度输出v o i d t u::j i n d u i(i n t x){d u ili e[d u i c h a n g+1]= -1;d u ili e[d u i c h a n g]= x;du i c h a ng++;}//出队列,将队列中的最后一种数返回i n t t u::c hu d u i(){int j;j =du ili e[0];f o r(i n t i=0;i<d u i c h a n g;i++)d u ili e[i]=d u ili e[i+1];d u i c h a n g--;return j;}//判空函数,函数为空的时候返回 0boo l t u::p a n k o n g(){i f(d u i c h a n g == 0)return f a l s e;elsereturn t r u e;}//控制增加函数v o i d t u::z e ng j i a(){i n t j ;f o r(i n t i =0;i<nu m;i++)//插入顶点z j d i n gd i a n(i);cout<<"请输入需要增加的弧数(最少"<<num-1<<"条且确保连通)"<<e n d l;//插入弧c i n>>j;cout<<"请输入弧的头和尾和权值"<<e nd l;f o r(i=0;i<j;i++){//cout<<"插入第"<<i+1<<"条弧"<<e n d l;z j hu b i a n();}}/***算法思想:依次递增序列求出最小路劲,首先将顶点加入到 S 当中(本程序默认为 0 号顶点),然后用d i s t数组保存到每一种顶点的最小途径长度**d i s t起始为顶点到其它顶点的权值(到本身为 0,到无弧顶点为无穷大)**1:然后每次取 v0-vk(k 属于 V-S)最小的路劲长度,取完之后将 Vk 加入 S 当中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告实验名称--SOCKET编程一、实验目的(1)加深对TCP和UDP的理解;(2)实现两台计算机之间TCP/UDP通信。
二、实验过程原理:socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络信。
如下图所示:TCP通信原理如图:代码:服务器端:#pragma comment(lib, "WS2_32.lib")#include<Winsock2.h>#include<iostream>#include<stdlib.h>using namespace std;int main(){int i=0;WSADATA wsaData;SOCKET oldSocket,newSocket;//客户地址长度int iLen=0;//发送的数据长度int iSend=0;//接收的数据长度int ircv =0;//处世要发送给客户的信息char buf[20]="I am a server";//接收来自用户的信息char fromcli[512];//客户和服务器的SOCKET地址结构struct sockaddr_in ser,cli;if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){cout<<"failed to load winsock"<<endl;return 0;}cout<<"server waiting"<<endl;cout<<"---------------"<<endl;//创建服务器端帧听SOCKEToldSocket=socket(AF_INET,SOCK_STREAM,0);if(oldSocket==INVALID_SOCKET){cout<<"socket() failed:"<<WSAGetLastError()<<endl;return 0;}//以下是建立服务器端的SOCKET地址结构ser.sin_family=AF_INET;ser.sin_port=htons(5050);//使用系统指定的ip地址INADDR_ANY// ser.sin_addr.s_addr=htonl(INADDR_ANY);ser.sin_addr.s_addr= inet_addr("192.168.8.58");if(bind(oldSocket,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR) {cout<<"bind() failed:"<<WSAGetLastError()<<endl;return 0;}//进入侦听状态if(listen(oldSocket,5)==SOCKET_ERROR){cout<<"listen() failed:"<<WSAGetLastError()<<endl;return 0;}//接收客户端的连接iLen=sizeof(cli);newSocket=accept(oldSocket,(struct sockaddr*)&cli,&iLen);//产生一个新的SOCKETif(newSocket==INVALID_SOCKET){cout<<"accept() failed:"<<WSAGetLastError()<<endl;//return 0;}//进入一个无限循环,等待客户发送数据while(1){i++;//服务器初始化接收缓冲区memset(fromcli,0,512);ircv=recv(newSocket,fromcli,sizeof(fromcli),0);if(ircv==SOCKET_ERROR){cout<<"rcv() failed:"<<WSAGetLastError()<<endl;break;}else if(ircv==0)break;else {cout<<"-----服务器接收的容为--------"<<fromcli<<endl;}if(strcmp(fromcli,"quit")==0)break;}closesocket(newSocket);closesocket(oldSocket);WSACleanup();}客户端:#pragma comment(lib, "WS2_32.lib")#include<winsock2.h>#include<iostream>#include<stdio.h>using namespace std;#define DATA_BUFFER 512int main(){WSADATA wsaData;SOCKET sClient;char ch;int i=0;char *Serip="192.168.8.58";//随着程序所在主机的地址改变而改变int SeriPort=5050;//从服务器接收的数据的长度int iLen;//发送的数据长度int isnd;//接收缓冲区char buf[DATA_BUFFER];//发送缓冲区char sndbuf[DATA_BUFFER];//服务器端SOCKET地址结构struct sockaddr_in ser;//接收/发送缓冲区的初始化memset(buf,0,sizeof(buf));memset(sndbuf,0,DATA_BUFFER);if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){cout<<"failed to load winsock"<<endl;return 0;}//填写要连接的服务器地址信息ser.sin_family=AF_INET;ser.sin_port=htons(SeriPort);ser.sin_addr.s_addr=inet_addr(Serip);//建立客户端字节流式套接字sClient=socket(AF_INET,SOCK_STREAM,0);if(sClient==INVALID_SOCKET){cout<<"socket() failed :"<<WSAGetLastError()<<endl;return 0;}//请求与服务器建立连接// cout<<"set link";if(connect(sClient,(struct sockaddr *)&ser,sizeof(ser))==INVALID_SOCKET){cout<<"connect() failed: "<<WSAGetLastError()<<endl;return 0;}else{//向服务器端发送数据while(1){cout<<endl;i++;cout<<"第"<<i<<"发送"<<endl;cin>>sndbuf;isnd=send(sClient,sndbuf,sizeof(sndbuf),0);if(isnd==0)return 0;else if(isnd==SOCKET_ERROR){cout<<"send() failed:"<<WSAGetLastError()<<endl;return 0;}cout<<"-----客户端发送容为----"<<sndbuf<<endl;}}closesocket(sClient);WSACleanup();}本机上客户端与服务器端通信结果如图:在两台服务器上分别运行服务器端和客户端,结果如图:UDP通信原理如图:代码:服务器端:#include "stdafx.h"#include <winsock2.h>#include <stdio.h>#include <stdlib.h>#define buffer_length 512#pragma comment(lib, "WS2_32.lib")void main(){WSADATA wsadata;SOCKET sSocket;int ilen;int irecv;char recv_buf[buffer_length];char send_buf[buffer_length];//服务器和客户SOCKET地址结构struct sockaddr_in seradd,cliadd;if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0){printf("failed to load winsocket\n");return;}sSocket=socket(AF_INET,SOCK_DGRAM,0);if(sSocket==INVALID_SOCKET){printf("socket() failed:%d\n",WSAGetLastError());return;}//初始化服务器SOCKET地址结构seradd.sin_family=AF_INET;seradd.sin_port=htons(6666);//seradd.sin_addr.s_addr=htonl(INADDR_ANY);seradd.sin_addr.s_addr= inet_addr("0.0.0.0");if(bind(sSocket,(LPSOCKADDR)&seradd,sizeof(seradd))==SOCKET_ERR OR){printf("地址绑定时出错:%d\n",WSAGetLastError());int rua;scanf("%d", &rua);return;}ilen=sizeof(cliadd);//初始化接收缓冲区memset(recv_buf,0,sizeof(recv_buf));irecv=recvfrom(sSocket,recv_buf,buffer_length,0,(structsockaddr*)&cliadd,&ilen);if(irecv==SOCKET_ERROR){printf("接收出错%d\n",WSAGetLastError());int rua;scanf("%d", &rua);return;}else if(irecv==0)return;else{printf("\n%s--",recv_buf);printf("Server received from Client ip:[%s],port:[%d]\n",inet_ntoa(cliadd.sin_addr),ntohs(cliadd.sin_port));}while(1){//在此函数中cli为传出参数irecv=recvfrom(sSocket,recv_buf,buffer_length,0,(structsockaddr*)&cliadd,&ilen);if(irecv==SOCKET_ERROR){printf("接收出错%d\n",WSAGetLastError());int rua;scanf("%d", &rua);return;}else if(irecv==0)break;else{printf("\n%s--",recv_buf);printf("Server received from Client ip:[%s],port:[%d]\n",inet_ntoa(cliadd.sin_addr),ntohs(cliadd.sin_port));}scanf("%s",send_buf);sendto(sSocket,send_buf,sizeof(send_buf),0,(structsockaddr*)&cliadd,sizeof(cliadd));}closesocket(sSocket);WSACleanup();}客户端:#include "stdafx.h"#include<winsock2.h>#include <stdio.h>#define data_buffer 1024void main(){WSADATA wsadata;SOCKET sclient;//服务器地址、端口号char * serip="192.168.8.58";int Seriport=6666;char ch[]="qita";//服务器SOCKET地址结构长度int ilen;//发送/接收数据大小int isend;int irecv;//要发送给服务器的数据char send_buf[]="hello,I am a client.";char recv_buf[data_buffer];//服务器端的SOCKET地址结构struct sockaddr_in seradd, cliadd;//初始化接收缓冲区memset(recv_buf,0,sizeof(recv_buf));//字符数组初始化memset(ch,0,sizeof(ch));if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0){printf("failed to load winsock\n");return;}// 服务器SOCKET地址结构初始化seradd.sin_family=AF_INET;seradd.sin_port=htons(Seriport);seradd.sin_addr.s_addr=inet_addr(serip);cliadd.sin_family=AF_INET;cliadd.sin_port=htons(7777);cliadd.sin_addr.s_addr=inet_addr("0.0.0.0");sclient=socket(AF_INET,SOCK_DGRAM,0);if(sclient==INVALID_SOCKET){printf("build socket failed!\n");return;}if(bind(sclient,(LPSOCKADDR)&cliadd,sizeof(cliadd))==SOCKET_ERROR ){printf("地址绑定时出错:%d\n",WSAGetLastError());return;}//无连接不需要进行地址与套接字的绑定,直接发送数据即可ilen=sizeof(seradd);isend=sendto(sclient,send_buf,sizeof(send_buf),0,(struct sockaddr *)&seradd,ilen);if(isend!=0&&isend!=SOCKET_ERROR){//printf("data has been sent successfully!\n");printf("客户所发的数据为:%s, 字节数为:%d\n",send_buf,isend);}else return;while(1){scanf("%s",ch);sendto(sclient,ch,sizeof(ch),0,(structsockaddr*)&seradd,sizeof(seradd));irecv=recvfrom(sclient,recv_buf,data_buffer,0,(structsockaddr*)&seradd,&ilen);if(irecv==SOCKET_ERROR){printf("接收出错%d\n",WSAGetLastError());int rua;scanf("%d", &rua);return;}else if(irecv==0)break;else{printf("\n%s--",recv_buf);printf("Server received from Client ip:[%s],port:[%d]\n",inet_ntoa(seradd.sin_addr),ntohs(seradd.sin_port));}}closesocket(sclient);WSACleanup();}本机上客户端与服务器端通信结果如图:在两台服务器上分别运行服务器端和客户端,结果如图:三、实验中出现的问题实验中,因为对TCP和UDP中的代码不熟悉,编译时也缺少了头文件,导致在编译时一直都没有通过,最后在老师的提醒下知道了错误所在,才能编译通过。