简单的客户端、服务器程序_第1页
简单的客户端、服务器程序_第2页
简单的客户端、服务器程序_第3页
简单的客户端、服务器程序_第4页
简单的客户端、服务器程序_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

洛洛阳阳理理工工学学院院实实验验报报告告 系别计算机与信息 工程系 班级B100505学号B10050527姓名张勋 课程名 称 计算机网络 原理实验日期11 21 实验名 称 简单的客户端 服务器程序成绩 实验目的 实验目的 1 熟悉 Microsoft Visual Studio 2008 编程环境 2 了解 TCP 与 UDP 协议 以及它们之间的区别 3 了解客户 服务器模型原理 4 熟悉 Socket 编程原理 掌握简单的套接字编程 实验条件实验条件 硬件 PC 机 两台以上 网卡 已经设定好的以太网环境 软件 Microsoft Visual Studio 2008 实验内容 实验内容 1 编写用 TCP 协议实现的 Client 端和 Server 端程序并调试通过 程序分两部分 客户程序和服务器程序 工作过程是 服务器首先启动 它创建套接字之后等待客户的连接 客户启动后创建套接 字 然后和服务器建立连接 建立连接后 客户接收键盘输入 然后将数据发送到服务器 服 务器收到到数据后 将接收到的字符在屏幕上显示出来 或者服务器接收键盘输入 然后将数 据发送到客户机 客户机收到数据后 将接收到的字符在屏幕上显示出来 程序流程如下 Socket 建立流式套接字 返回套接字号 accept 接受连接 等待客户端的连接 bind 套接字 s 与本地地址相连 listen 通知 TCP 服务器准备好接收连接 Socket 建立流失套接字 返回套接字号 connect 将套接字 s 与远 地主机连接 服务器方 客户方 2 编写用 UDP 协议实现的 Client 端和 Server 端程序并调试通过 做完第一个实验的基础上做 该实验 3 编写用 TCP 协议实现 Client 端与 Server 端的一段对话程序 Server 端根据用户的输入来提 示 Client 端下一步将要进行操作 所用函数及结构体参考 1 创建套接字 socket 功能 使用前创建一个新的套接字 格式 SOCKET PASCAL FAR socket int af int type int procotol 参数 af 代表网络地址族 目前只有一种取值是有效的 即 AF INET 代表 internet 地址族 连接建立 accept 返回 得到新的套接字 sc recvt send 在套接字 sc 上读 写数据 直到 数据交换完毕 closesocket 关闭套接字 sc closesocket 关闭最初套接字 s 服务结束 send recv 在套接字上读 写数据 直到数据交换完 closesocket 关闭套接字 结束 TCP 对话 Socket 建立流式套接字 返回套接字号 bind 套接字 s 与本地地址相连 recvt send 在套接字上读 写数据 直到数据 交换完毕 closesocket 关闭套接字 Socket 建立流失套接字 返回套接字号 将套接字与远地主机连接 send recv 在套接字上读 写数据 直到数据交换完 closesocket 关闭套接字 结束 UDP 对话 服务器方 客户方 Type 代表网络协议类型 SOCK DGRAM 代表 UDP 协议 SOCK STREAM 代表 TCP 协 议 Protocol 指定网络地址族的特殊协议 目前无用 赋值 0 即可 返回值为 SOCKET 若返回 INVALID SOCKET 则失败 2 指定本地地址 bind 功能 将套接字地址与所创建的套接字号联系起来 格式 int PASCAL FAR bind SOCKET s const struct sockaddr FAR name int namelen 参数 s 是由 socket 调用返回的并且未作连接的套接字描述符 套接字号 其它 没有错误 bind 返回 0 否则 SOCKET ERROR 地址结构说明 struct sockaddr in short sin family AF INET u short sin port 16 位端口号 网络字节顺序 struct in addr sin addr 32 位 IP 地址 网络字节顺序 char sin zero 8 保留 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 参数 s 是由 socket 调用返回的并且未作连接的套接字描述符 套接字号 4 监听连接 listen 功能 用于面向连接服务器 表明它愿意接收连接 格式 int PASCAL FAR listen SOCKET s int backlog 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 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 库的一些相关信息 其结构定义如下 typedef struct WSAData WORD wVersion WORD wHighVersion char szDescription WSADESCRIPTION LEN 1 char szSystemStatus WSASYS STATUS LEN 1 unsigned short iMaxSockets unsigned short iMaxUdpDg char FAR lpVendorInfo WSADATA typedef WSADATA FAR LPWSADATA 值得注意的就是 wVersion 字段 存储了 Socket 的版本类型 LPWSADATA 是 WSADATA 的 指针类型 它们不用程序员手动填写 而是通过 Socket 的初始化函数 WSAStartup 读取出来 9 sockaddr in in addr 类型 sockaddr in 定义了 socket 发送和接收数据包的地址 定义 struct sockaddr in short sin family u short sin port struct in addr sin addr char sin zero 8 其中 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 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 的含义比 in addr 的含义要广泛 其各个字段的含义和取值如下 第一个字段 short sin family 代表网络地址族 如前所述 只能取值 AF INET 第二个字段 u short sin port 代表 IP 地址端口 由程序员指定 第三个字段 struct in addr sin addr 代表 IP 地址 第四个字段 char sin zero 8 是为了保证 sockaddr in 与 SOCKADDR 类型的长度相等而填充 进来的字段 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 n Server TCP n n n 建立套接字 const WORD wMinver 0 x0101 WSADATA wsadata if 0 WSAStartup wMinver 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 exit 1 开始侦听 if SOCKET ERROR listen sock1 5 perror Listening stream socket exit 1 接受连接 printf Ready to serve client Please connect n n n sin size sizeof struct sockaddr in if sock2 accept sock1 struct sockaddr 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 n Server Menu n n n printf n n printf 1 Send Message n printf 2 Receive Message n printf 3 Exit n n printf n do printf n Enter your choice gets s if s 0 0 gets s c atoi s while c3 free s return c 消息发送函数 void Send char Msg 10240 printf nPlease Input the message gets Msg Msg 10239 0 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 WSACleanup Client 端代码 端代码 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 n Client TCP n n 建立套接字 const WORD wMinver 0 x0101 WSADATA wsadata if 0 WSAStartup wMinver if INVALID SOCKET sock1 socket AF INET SOCK STREAM 0 perror Create socket error my addr sin family AF INET printf please input the Server s IP char s 20 gets s s 19 0 my addr sin addr S un S addr inet addr s my addr sin port htons 1000 请求连接 printf connecting sin size sizeof struct sockaddr in if sock2 connect sock1 LPSOCKADDR exit 1 选择菜单 int menu char s char malloc 2 sizeof char int c printf n n n Client Menu n n n printf n n printf 1 Send Message n printf 2 Receive Message n printf 3 Exit n n printf n do printf n Enter your choice gets s if s 0 0 gets s c atoi s while c3 free s return c 消息发送函数 void Send char Msg 1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论