ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:161.81KB ,
资源ID:22227885      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22227885.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(简单的服务器客户端程序实验报告Word格式文档下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

简单的服务器客户端程序实验报告Word格式文档下载.docx

1、功能:使用前创建一个新的套接字格式: SOCKET PASCAL FAR socket(int af, int type, int procotol);参数: af :代表网络地址族,目前只有一种取值是有效的,即 AF_INET ,代表 internet 地址族;Type:代表网络协议类型, SOCK_DGRAM 代表 UDP 协议, SOCK_STREAM 代表 TCP 协议;Protocol :指定网络地址族的特殊协议,目前无用,赋值 0 即可。返回值为 SOCKET ,若返回 INV ALID_SOCKET 则失败。2、指定本地地址 bind() 功能:将套接字地址与所创建的套接字号联系

2、起来。 int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen); 参数: s: 是由 socket() 调用返回的并且未作连接的套接字描述符(套接字号) 。其它:没有错误, bind() 返回 0,否则 SOCKET_ERROR 地址结构说明:struct sockaddr_inshort sin_family;/AF_INETu_short sin_port;/16 位端口号,网络字节顺序 struct in_addr sin_addr;/32 位 IP 地址,网络字节顺序 char sin_z

3、ero8;/ 保留3、建立套接字连接 connect()和 accept() 功能:共同完成连接工作 int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR * name, int namelen); SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR * name, int FAR * addrlen);4、监听连接 listen() 功能:用于面向连接服务器,表明它愿意接收连接。 格式: int PASCAL FAR listen(SOCKET s, int backlo

4、g);5、数据传输 send()与 recv() 功能:数据的发送与接收 格式: int PASCAL FAR send(SOCKET s, const char FAR* buf, int len, int flags);int PASCAL FAR recv(SOCKET s, const char FAR * buf, int len, int flags); buf: 指向存有传输数据的缓冲区的指针。6、多路复用 select() 功能:用来检测一个或多个套接字状态。 int PASCAL FAR select(int nfds, fd_set FAR* readfds, fd_set

5、 FAR* writefds, fd_set FAR * exceptfds, const struct timeval FAR* timeout); readfds:指向要做读检测的指针 writefds: 指向要做写检测的指针 exceptfds:指向要检测是否出错的指针 timeout: 最大等待时间7、关闭套接字 closesocket() 功能:关闭套接字 s BOOL PASCAL FAR closesocket (SOCKET s);8、 WSADATA 类型和 LPWSADATA 类型WSADATA 类型是一个结构,描述了 Socket 库的一些相关信息,其结构定义如下: ty

6、pedef struct WSAData WORDWORD char char unsigned short unsigned shortwVersion;wHighV ersion;szDescriptionWSADESCRIPTION_LEN+1; szSystemStatusWSASYS_STATUS_LEN+1;iMaxSockets;iMaxUdpDg; WSADATA;typedef WSADATA FAR *LPWSADA TA;值得注意的就是 wVersion 字段,存储了 Socket的版本类型。 LPWSADA TA 是WSADATA 的指针 类型。它们不用程序员手动填写,

7、而是通过 Socket 的初始化函数 WSAStartup 读取出来。9、 sockaddr_in 、 in_addr 类型 sockaddr_in 定义了 socket 发送和接收数据包的地址。 定义:struct sockaddr_in struct in_addr sin_addr;char sin_zero8;其中 in_addr 的定义如下:struct in_addr union struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b;struct u_short s_w1,s_w2; S_un_w;u_long S_addr; S_un;首先阐述 in

8、_addr 的含义,很显然它是一个存储 ip 地址的联合体,有三种表达方式: (1)用四个字节来表示 IP 地址的四个数字;( 2)用两个双字节来表示 IP 地址;( 3)用一个长整型来表示 IP 地址。给 in_addr 赋值的一种最简单方法是使用 inet_addr 函数,它可以把一个代表 IP 地址的字符串赋值 转换为 in_addr 类型,如addrto.sin_addr.s_addr=inet_addr(192.168.0.2); 本例子中由于是广播地址,所以没有使用这个函数。其反函数是 inet_ntoa ,可以把一个 in_addr 类型转换为一个字符串。sockaddr_in

9、的含义比 in_addr 的含义要广泛,其各个字段的含义和取值如下:第一个字段 short sin_family ,代表网络地址族,如前所述,只能取值 AF_INET ; 第二个字段 u_short sin_port ,代表 IP 地址端口,由程序员指定; 第三个字段 struct in_addr sin_addr ,代表 IP 地址;第四个字段 char sin_zero8 ,是为了保证 sockaddr_in 与 SOCKADDR 类型的长度相等而填 充进来的字段。Sever 端代码:/ server.cpp : 定义控制台应用程序的入口点。#include windows.hstdio.

10、hstdlib.h#pragma comment(lib, WS2_32)SOCKET sock1,sock2;int sin_size ;struct sockaddr_in my_addr,their_addr;char name20;/初始化函数 Tcpvoid Init()printf(nnn Server: TCPnnn/建立套接字const WORD wMinver=0x0101;WSADATA wsadata;if(0!=:WSAStartup(wMinver,&wsadata) perror(Start socket error!if(INV ALID_SOCKET=(sock

11、1=: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 socketexit(1);/开始侦听listen(sock1,5)Listening stream s

12、ocket/接受连接Please Ready to serve client.connect.nnnsin_size = sizeof(struct sockaddr_in);if(sock2=accept(sock1,(struct sockaddr *)&their_addr,&sin_size)=-1)Accepting stream socket exit(1);connet:%s,inet_ntoa(their_addr.sin_addr);/选择菜单int menu()char *s=(char*)malloc(2*sizeof(char);int c;nnnMenunnn*nn*

13、n*nn*ndongets(s);if(s0=0)c=atoi(s);while(c3);free(s);return c;Accepting a newServer:1.Send Message2.Receive Message* 3.ExitEnter your choice:/消息发送函数void Send()char Msg10240; printf(nPlease Input the message: gets(Msg);Msg10239=;send(sock2,Msg,strlen(Msg),0);/消息接收函数 void Receive() int len;char buf102

14、40;for(int i=0;i10240;i+) bufi=if(len=:recv(sock2,buf,10240,0)=-1)Receving data errorThe Received Message:%sn,buf);/主函数 void main() Init();for(;switch(menu()case 1:Send(); break;case 2: Receive();case 3: exit(0);/:closesocket(sock2); :closesocket(sock1);WSACleanup();Client 端代码:/ client.cpp : #includ

15、e nnn Client: if(0!socket(AF_INET,SOCK_STREAM,0)my_addr.sin_addr.S_un.S_addr=inet_addr(192.168.93.48/请求连接 connecting.if(sock2=(:connect(sock1,(LPSOCKADDR)&my_addr,sin_size)=-1) 1.SendMessage2.Receive3.Exitn Enter your choice: gets(s); c=atoi(s);gets(Msg);send(sock1,Msg,strlen(Msg),0);recv(sock1,buf,

16、10240,0)=-1)/主函数void main()break;Receive();exit(0);Client 端界面:实验结果及心得 : 实验结果截图: 客户端向服务端发送信息:客户端接收服务端消息:服务端接收消息:实验心得: 通过本次实验及课上老师讲解, 了解了 TCP 与 UDP 协议和它们之间的区别, 以及客 户/服务器模型的原理。 通过 C/S 代码的编写运行,形象地 看到客户 /服务器端的运作方式, 对于 C/S 模型有了很深刻的印象以及进一步理解。通过代码的编写, 再一次熟悉 Socket 编程原理,掌握简单的套接字编程。第一次运行程序成功后, 是在同一台电脑上进行 C 与 S 端的连接。 在课上实验, 将程序放在2 台台式机上进行运行,在与同学探讨中又将代码中有关部分,比如 IP 地址等进行了修改,最终使程序在 2 台电脑上运行成功。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1