基于c和c++的socket实现_第1页
基于c和c++的socket实现_第2页
基于c和c++的socket实现_第3页
基于c和c++的socket实现_第4页
基于c和c++的socket实现_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

Initsock h 文件 1 initsock h 文件 2 3 include 4 include 5 include 6 include 7 8 pragma comment lib WS2 32 链接到 WS2 32 lib 9 10 class CInitSock 11 12 public 13 CInitSock BYTE minorVer 2 BYTE majorVer 2 14 15 初始化 WS2 32 dll 16 WSADATA wsaData 17 WORD sockVersion MAKEWORD minorVer majorVer 18 if WSAStartup sockVersion 21 22 23 CInitSock 24 25 WSACleanup 26 27 TCP 版 TCPClient cpp 文件 1 2 TCPClient cpp 文件 3 4 使用说明 5 6 0 运行程序前请查看是否将 initsock h 7 文件引入到项目中 8 9 1 首先修改聊天对方的 IP 地址 10 11 2 请首先运行服务端 TCPServer 程序 再运行客户端 TCPClient 程序 12 如配置正确服务端会收到相关连接信息 13 14 3 连接成功后 需要由服务器端首先发起会话 输入消息并确认发送 15 客户端收到消息后才能输入消息并确认发送到服务器端 16 并且双方每次只能发送一条消息 如想发送第二条消息 需要等待该方成功 17 接受到另一方的消息后才能继续输入消息 18 19 20 21 include InitSock h 22 include 23 include 24 CInitSock initSock 初始化 Winsock 库 25 26 int main 27 28 创建套节字 29 SOCKET s socket AF INET SOCK STREAM IPPROTO TCP 30 if s INVALID SOCKET 31 32 printf Failed socket n 33 return 0 34 35 36 也可以在这里调用 bind 函数绑定一个本地地址 37 否则系统将会自动安排 38 39 填写远程地址信息 40 sockaddr in servAddr 41 servAddr sin family AF INET 42 servAddr sin port htons 4567 43 注意 这里要填写服务器程序 TCPServer 程序 所在机器的 IP 地址 44 如果你的计算机没有联网 直接使用 127 0 0 1 即可 45 servAddr sin addr S un S addr inet addr 192 168 1 129 46 47 if connect s sockaddr 50 return 0 51 52 53 char buff 256 54 char szText 256 55 56 while TRUE 57 58 从服务器端接收数据 59 int nRecv recv s buff 256 0 60 if nRecv 0 61 62 buff nRecv 0 63 printf 接收到数据 s n buff 64 65 66 向服务器端发送数据 67 68 cin szText 69 szText 255 0 70 send s szText strlen szText 0 71 72 73 74 关闭套节字 75 closesocket s 76 return 0 77 TCPServer cpp 文件 1 TCPServer cpp 文件 2 3 使用说明 4 5 0 运行程序前请查看是否将 initsock h 6 文件引入到项目中 7 8 1 首先修改聊天对方的 IP 地址 9 10 2 请首先运行服务端 TCPServer 程序 再运行客户端 TCPClient 程序 11 如配置正确服务端会收到相关连接信息 12 13 3 连接成功后 需要由服务器端首先发起会话 输入消息并确认发送 14 客户端收到消息后才能输入消息并确认发送到服务器端 15 并且双方每次只能发送一条消息 如想发送第二条消息 需要等待该方成功 16 接受到另一方的消息后才能继续输入消息 17 18 19 20 include InitSock h 21 include 22 include 23 CInitSock initSock 初始化 Winsock 库 24 25 int main 26 27 创建套节字 28 SOCKET sListen socket AF INET SOCK STREAM IPPROTO TCP 29 if sListen INVALID SOCKET 30 31 printf Failed socket n 32 return 0 33 34 35 填充 sockaddr in 结构 36 sockaddr in sin 37 sin sin family AF INET 38 sin sin port htons 4567 39 sin sin addr S un S addr INADDR ANY 40 41 绑定这个套节字到一个本地地址 42 if bind sListen LPSOCKADDR 45 return 0 46 47 48 进入监听模式 49 if listen sListen 2 SOCKET ERROR 50 51 printf Failed listen n 52 return 0 53 54 55 循环接受客户的连接请求 56 sockaddr in remoteAddr 57 int nAddrLen sizeof remoteAddr 58 SOCKET sClient 0 59 char szText TCP Server Demo r n 60 while sClient 0 61 62 接受一个新连接 63 sClient accept sListen SOCKADDR 64 if sClient INVALID SOCKET 65 66 printf Failed accept 67 68 69 70 printf 接受到一个连接 s r n inet ntoa remoteAddr sin addr 71 continue 72 73 74 while TRUE 75 76 向客户端发送数据 77 gets szText 78 send sClient szText strlen szText 0 79 80 从客户端接收数据 81 char buff 256 82 int nRecv recv sClient buff 256 0 83 if nRecv 0 84 85 buff nRecv 0 86 printf 接收到数据 s n buff 87 88 89 90 91 关闭同客户端的连接 92 closesocket sClient 93 94 关闭监听套节字 95 closesocket sListen 96 97 return 0 98 UDP 版 1 Chat cpp Defines the entry point forthe console application 2 3 4 使用说明 5 6 0 运行程序前请查看是否将 initsock h 7 文件引入到项目中 8 9 1 首先修改聊天对方的 IP 地址 10 11 2 运行程序 如配置正确另一方会收到相关连接信息 12 13 3 输入消息 在每次输入完欲发送的消息后 需要连续敲击两次回车 14 15 4 本程序有诸多缺陷 对用户输入的消息不能即时回显到控制台 16 需要在敲击两次回车后回显到屏幕 17 18 19 20 include stdafx h 21 include 22 include 23 include 24 include 25 include InitSock h 26 27 using namespace std 28 29 30 CInitSock initSock 初始化 Winsock 库 31 32 DWORD receiverMark 接收消息者线程标识符 33 DWORD senderMark 发送者线程标识符 34 35 36 37 定义信号量 38 39 DWORD WINAPI Receiver LPVOID 40 DWORD WINAPI Sender LPVOID 41 42 43 接收数据 44 char buff 1024 45 sockaddr in addr 46 47 48 int nLen sizeof addr 49 SOCKET s 50 51 52 int main int argc char argv 53 54 55 创建套节字 56 s socket AF INET SOCK DGRAM IPPROTO UDP 57 u long iMode 1 58 ioctlsocket s FIONBIO 59 60 if s INVALID SOCKET 61 62 printf Failed socket n 63 return 0 64 65 66 填充 sockaddr in 结构 67 sockaddr in sin 68 sin sin family AF INET 69 sin sin port htons 4567 70 sin sin addr S un S addr INADDR ANY 71 72 addr sin family AF INET 73 addr sin port htons 4567 74 注意 这里要填写服务器程序所在机器的 IP 地址 75 如果你的计算机没有联网 直接使用 127 0 0 1 即可 76 addr sin addr S un S addr inet addr 192 168 1 129 77 78 绑定这个套节字到一个本地地址 79 if bind s LPSOCKADDR 82 return 0 83 84 85 发送数据 86 char szText PC 请求连接 r n 87 sendto s szText strlen szText 0 sockaddr 88 89 CreateThread NULL 0 Receiver NULL 0 90 CreateThread NULL 0 Sender NULL 0 91 92 bool isContinue true 93 while isContinue 94 95 if getche 96 按 后终止程序运行 96 isContinue false 97 98 99 system PAUSE 100 return 0 101 102 103 104 105 接收者 106 107 DWORD WINAPI Receiver LPVOID lpParam 108 109 while 1 110 111 int nRecv recvfrom s buff 1024 0 sockaddr 112 if nRecv 0 113 114 buff nRecv 0 115 printf Received data s s n inet ntoa addr sin addr buff 116 117 118 119 return 0 120 121 122 123 发送者 124 125 DWORD WINAPI Sender LPVOID lpPara 126 127 while 1 128 129 cout text 134 text 255 0 135 cout text endl 136 137 sendto s text strlen text 0 sockaddr 138 139 140 return 0 141 本文来自 CSDN 博客 转载请标明出处 使用 C C 实现 Socket 聊天程序 解决该问题的思路 解决该问题的整体方案不外有二 1 基于 TCP 的 Socket 连接 2 基于 UDP 的 Socket 连接 但是 针对每种方案又各有很多具体的实现方法 在本次实验中 我先后开发了基于 TCP 连接和 UDP 连接的 Socket 聊天程序 具体实现 思路如下 一 基于 TCP 连接 Socket 聊天程序 基于该连接的聊天程序需要至少具备一个服务器端 Server 和一个客户端 Client 在本程序中 一个用户作为 Server 端 另一个用户作为 Client 端 也 就是说 作为 Server 端的用户 需要首先启动程序 等待 Client 端的连接请求 当 TCP 连接握手以后 双方可进行交互 注 在本程序中 Server 端并不是单独存在 它也可以向他的 Client 端发送消息 但是本程序实现的交互功能十分简单 具有很 多限制 当 Client 端与 Server 端握手以后 Server 端需要首先发起会话 Client 端 在收到消息后再回复一条消息给 Server 端 同样 Server 端在收到消息后再回复一 条消息给 Client 端 以此类推 并且 无论是 Server 端还是 Client 端每次发送消 息只能发送一条 造成交互操作具有诸多限制的主要原因是 我在 Server 端和 Client 端使用了一个 While 循环 它们的伪代码分别如下 Client 端 Server 端 while TRUE 从 Server 端接收消息 向 Server 端发送消息 while TRUE 向 Client 端发送消息 从 Client 端接收消息 二 基于 UDP 连接 Socket 聊天程序 基于该连接的聊天程序不需要具备服务器端 Server 每个客户端 Client 既是 服务器端也是客户端 也就是说每个 Client 端自身既可以自行接收其它用户发来的消 息 也可以向其它 Client 端发送消息 不需要事先与其他用户进行握手连接 由于在默认情况下 WinSock 接口的 recvfrom 和 sendto 都会在被调用时阻塞当前线 程 也就是说如果程序正在接受其他用户发来的数据 那么它就不能够执行发送数据 的任务 反之相同 所以为解决该问题一般有以下几种解决方案 采用 Select 模型 WSAAsyncSelect 模型 WSAEventSelect 模型 重叠 Overlapped 模型和完成接口 Completion port 模型 在本程序中 由于我没能在短时间内学会上述方案中的任 一种 因此采用了多线程技术去实现消息接收和发送的同步问题 也就是说 在程序 中创建两个线程 一个线程负责发送消息 另一个消息负责接受消息 两个线程交替 运行 从而达到同时收发消息的目的 当然采用多线程方式解决消息收发同步问题可 以移除上个程序中每个用户一次只能发送一条消息的限制 本周开发源代码 代码的功能简述 使用 C C 实现 S

温馨提示

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

评论

0/150

提交评论