




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一个基于一个基于 TCP 的阻塞模型的并发回显服务器的阻塞模型的并发回显服务器 客户端程序客户端程序 by windhawk 一 概述 网络编程普遍使用 socket 接口来实现网络间的进程通信 具体的 TCP IP 细节被封装在 内核之中 由内核完成 用户只需要使用内核提供的 socket API 来实现通信即可 Windows 网络编程继承了 Unix 的 socket 接口 基本模式同 Unix 大同小异 但是由于 两个系统的实现不同 在具体实现网络程序时仍存在一些差异 包括一些 socket API 的原型 以及并发服务器的编写方法等 二 Winsock 与 Unix Socket 比较 Socket APIUnixWindows WSAStartup 初始化 winsock 版本信息 加载 动态链接库 无WSADATA wsaData Int WSAStartup MAKEWORD 2 2 成功 ul 标识符 败 1 SOCKET sockfd socket AF INET SOCK STREAM IPPROTO TCP 成功 u long 句柄 败 INVALID SOCKET Bind 为 socket 绑定一 个地址 Int bind sockfd struct sockaddr 成功 0 失败 1 Int bind sockfd struct sockaddr 成功 0 失败 SOCKET ERROR Connect 客户端主动发 起一个连接请求 即 SYN 包 Int connect sockfd struct sockaddr 成功 0 失败 1 Int connect sockfd struct sockaddr 成功 0 失败 SOCKET ERROR listen 将套接字设置成 监听状态 Int listen sockfd int n 成功 0 失败 1 Int listen sockfd int n 成功 0 失败 SOCKET ERROR Accept 等待连接请求 返回已连接套接字 Int connfd accept sockfd struct sockaddr 成功 connfd 失败 1 SOCKET connfd accept sockfd struct sockaddr 成功 connfd 失败 INVALID SOCKET 关闭套接字关闭套接字Close sockfd Close connfd Closesocket sockfd Closesocket connfd WSACleanup Shutdown 用于禁止在 指定的套接字上发送和接 受数据 无Int shutdown connfd SD BOTH Int shutdown connfd SD RECEIVE Int shutdown connfd SD SEND 成功 0 失败 SOCKET ERROR 数据发送函数数据发送函数 Int write connfd sendbuff Int ret send connfd sendbuff 成功 返回实际发送的字 节数 失败 1 strlen buff strlen buff 0 数据接收函数数据接收函数 成功 返回实际接受的字 节数 失败 1 Int read connfd recvbuff sizeof recvbuff Int recv connfd recvbuff sizeof recvbuff 0 最后一个选项作为 flags 位 用于 影响函数的行为 0 标示没有特 殊行为 由上表可见 winsock 与 Unix 的 socket API 基本上完全一致 除了关闭套接字和 I O 函数略 有不同以外 实现了全部继承 除了函数的不同 在一些细节上 Windows 与 Unix 也略有不同 比如 1 Unix 下套接字地址结构为 struct sockaddr in uint8 t sin len 套接字地址结构的长度 IPv4 固定 16 个字节 IPv6 固定 28 个字节 sa family t sin family AF INET in port t sin port 协议端口地址 数据类型为 uint6 网络字节顺序 struct in addr sin addr 协议 IP 地址 数据类型为 uint32 网络字节顺序 char sin zero 8 unused 其中 sturct in addr in addr t s addr Windows 下的不同在于 struct 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 这里联合体中的 S un 包含了 32 位 IP 的三种表示形式 按字符 按字 按无符号长整型 我们一般区 S addr 所以正式设置套接字地址结构 IP 时我们在 Windows 下使用的是 servaddr sin addr S un S addr inet addr 192 168 100 254 2 包含的头文件 Unix 下使用 socket 接口编写网路程序需要包含许多头文件 而 Windows 下基本就需要添加 include pragma comment lib ws2 32 lib 三 几点需要注意的问题 1 socket API 函数多数是由进程向内核传递套接字结构 此时需要指明传递的结构长度 使得内核读入指定长度的字节 如 bind connect 而对于 accept 函数则可以由内核 向进程双向返回值 所以其中的套接字地址结构和长度均需要使用指针 2 write read 和 send recv 函数都需要事先指定存储发送 读取数据的缓冲区及大小 为了避免之后输出时的错误 我们可以用 memset buff 0 sizeof buff 将缓冲区初始化 为空字符 接受数据时就不会因为结束字符问题导致输出错误 四 程序源码 Server 程序 一个简单的 TCP 服务器程序 1 接受客户端连接后显示客户端的输入 2 向客户端回显该输入 3 若收到 quit 则断开连接 退出程序 4 创建新线程实现并发连接 客户端输入 shutdown 时关闭服务器 include include include include 添加默认链接库 pragma comment lib ws2 32 lib define bzero a b memset a 0 b vc 下没有 bzero 的定义 用 memset 代替 void memset void dst int c size t len DWORD WINAPI AnswerThread LPVOID lparam 线程函数声明 struct sockaddr in cliaddr 定义外部变量供线程函数调用 int main int argc char argv 初始化 winsock 版本信息 加载动态链接库 dll WSADATA wsaData if WSAStartup MAKEWORD 2 2 return 1 创建监听套接字 SOCKET sockfd if sockfd socket AF INET SOCK STREAM IPPROTO TCP INVALID SOCKET printf socket failed n WSACleanup return 1 设置服务器地址 struct sockaddr in servaddr bzero servaddr sin family AF INET servaddr sin port htons 9999 servaddr sin addr S un S addr htonl INADDR ANY 绑定 socket 地址结构到监听套接字 if bind sockfd struct sockaddr closesocket sockfd WSACleanup 在 Server 上进行监听 if listen sockfd 4 0 printf listen failed n closesocket sockfd WSACleanup return 1 接受客户端的连接请求 printf TCP Server Start n int cliaddrlen sizeof cliaddr cliaddrlen 需要有初值 作为一个值 结果参数参与函 数 bzero memset SOCKET connfd 循环等待 while true if connfd accept sockfd struct sockaddr closesocket sockfd WSACleanup return 1 创建新线程 DWORD ThreadID double word CreateThread NULL 0 AnswerThread LPVOID connfd 0 线程函数 AnswerThread DWORD WINAPI AnswerThread LPVOID lparam 在 Server 和 Client 之间接收和发送数据 char buff 100 extern sockaddr in cliaddr SOCKET connfd SOCKET LPVOID lparam while true int ret recv connfd buff sizeof buff 0 if ret SOCKET ERROR printf recv failed n closesocket connfd WSACleanup return 1 为了避免打印错误 将字符串 buff 结尾设成 0 x00 buff ret 0 x00 获取当前系统时间 SYSTEMTIME st GetLocalTime char SysDate 30 将 systime 中的时间转变为字符串存入 SysDate 30 sprintf SysDate 4d 2d 2d 2d 2d 2d st wYear st wMonth st wDay st wHour st wMinute st wSecond Server 显示客户端信息 printf s Recv from Client s d s n SysDate inet ntoa cliaddr sin addr ntohs cliaddr sin port buff 服务器向客户端回显信息 如果客户端发送 quit 字符串 则服务器退出 if strcmp buff quit 0 send connfd quit strlen quit 0 break 否则向客户端回显字符串 else if strcmp buff shutdown 0 send connfd shutdown server strlen shutdown server 0 printf Server is shutdowning n WSACleanup system pause break else char msg 100 sprintf msg Message Received s buff if send connfd msg strlen msg 0 SOCKET ERROR printf send failed n closesocket connfd return 1 释放资源 closesocket connfd Client 程序 一个简单的 TCP 客户端连接程序 1 客户端向服务器端发送输入的字符串 2 接受服务器端的回显 include include include include define MAXSIZE 100 引用外部函数时需要加上 extern 关键字 定义函数时默认均是 extern extern int getline char s int max int main int argc char argv 初始化 winsock 结构 加载 winsock 动态库 WSAData wsaData if WSAStartup MAKEWORD 2 2 return 1 创建套接字 SOCKET sockfd if sockfd socket AF INET SOCK STREAM IPPROTO TCP INVALID SOCKET printf socket failed n return 1 初始化服务器地址结构 struct sockaddr in servaddr memset servaddr sin family AF INET servaddr sin port htons 9999 servaddr sin addr S un S addr inet addr 127 0 0 1 发起连接请求 if connect sockfd struct sockaddr closesocket sockfd WSACleanup return 1 else printf Connection build n 向服务器发送数据 char buff MAXSIZE memset buff 0 MAXSIZE while strcmp buff quit 0 getline buff MAXSIZE if send sockfd buff strlen buff 0 0 printf send failed
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 矫正光学像差技术标准规范
- 柑橘长期保存保鲜工艺流程
- 2025南平市延平区人民检察院驾驶员招聘考前自测高频考点模拟试题及一套参考答案详解
- 2025河北沧州孟村回族自治县民政事业服务中心消防操作员招聘6名考前自测高频考点模拟试题带答案详解
- 番禺安全主任培训课件
- 2025贵州省第三人民医院第十三届贵州人才博览会引才12人考前自测高频考点模拟试题及答案详解(名师系列)
- 2025安徽医科大学附属宿州医院博士、硕士研究生招聘47人模拟试卷及答案详解一套
- 2025甘肃天水市第四人民医院编外人员招聘3人考前自测高频考点模拟试题及一套完整答案详解
- 彩虹鸽课件教学课件
- 2025年滨州市面向社会公开招聘硕博士高层次人才(168人)模拟试卷带答案详解
- 中级注册安全工程师-其他安全历年真题
- 英语FCE语用词汇-必备词缀
- 小学生自己修改作文能力的培养研究课题结题报告.文档
- CREO基础培训教程
- GA/T 2012-2023窃照专用器材鉴定技术规范
- 诗化小说示范课
- (17)-第三节 反抗外国武装侵略的斗争
- 04质量奖(现场)评审报告
- GB/T 9728-2007化学试剂硫酸盐测定通用方法
- 全身式安全带定期检查表
- 《中药商品学》考试复习题库(含答案)
评论
0/150
提交评论