一种基于TCP协议的点对点通信方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2005 年第 9 期
黄焕等 :一种基于 TCP 协议的点对点通信方法
63
(2) 在互发数据过程中 ,为了模拟“占线”过程 ,对 其他终端发来的“请求通话”数据报 ,通信双方都应拒 绝 ,即发“拒绝通话”数据报 。
(3) 通信结束 ,双方都应互发“断开连接”数据报 。 以上过程会带来如下弊端 : (1) 假设一个机房内共有 36 台终端机 ,每台机之 间的数据报来往非常多 ,UDP 协议又是无连接的 ,不 保证数据传输的可靠性 ,这样很可能造成数据报丢 失 。如果有一方发出“请求通话”数据报后 ,为模拟 “占线”过程 ,它对其他终端的请求通话一律拒绝 ,但 被呼叫方的“确认”数据报由于在传输过程中丢失了 , 则双方不能建立通信 。这样 ,往往就出现这台终端机 看起来没有和其他终端机通信 ,而对该机的呼叫却屡 屡被拒绝 。实际上 , 该机是在等待被呼叫方的“确 认”,而“确认”数据报已丢失 。 (2) 在双方通信过程中 ,如果其他 34 台机都向他 们发“请求通话”数据报 ,则正在通信的两台机都要进 行处理 ,即发“拒绝”通话数据报 ,这样使程序的效率 下降 。 (3) 双方通信结束 ,应互发“断开连接”数据报 ,但 若有一方收不到 ,则使该方以为没有断线 ,结果是其 他终端机对他的“请求通话”数据报被拒绝 。 当然也可以采用收发双方都设置两个 socket ,一 个 socket 负责发送“请求通话”数据报或接收“请求通 话”数 据 报 , 双 方 同 意 建 立 通 话 后 , 转 到 另 外 一 个 socket 上进行信息交流 ,这样 ,就可避免“拒绝”通话 数据报的判断过程 ,但是 ,对“请求通话”数据报和“断 开连接”数据报的丢失问题不能够很好地解决 。
参考文献 : [1 ] 胡延平 ,陈志刚 ,等. 基于 UDP 协议的语音聊天系统的设
计与实现[J ] . 计算机工程与设计 ,2002 ,23 (12) :58~60. [2 ] 汪晓平 ,钟军 ,等. Visual C ++ 网络通信协议分析与应用
实现[M] . 北京 :人民邮电出版社 ,2003. [3 ] 林晓. 多线程在网络程序设计中的应用 [J ] . 华侨大学学
3 结束语
(1) 以上程序在 Windows 2000 和 Windows XP 环
境下全部运行通过 。 (2) 由于该程序巧妙地运用了多线程技术 ,使得
各个程序模块的调度非常自如 ,可以使用相关函数在 线程内部停止线程 ,也可以在线程外部利用相关函数 启动线程 。
(3) 采用基于 TCP 协议的编程方法 ,有效地保证 了数据传输的可靠性 ,避免了对基于 UDP 协议的程 序设计中所使用的大量数据报的判断过程 ,使程序更 为简洁和稳定 ,效率更高 ,同时可以利用各种出错信 息来判断是“占线”还是“拆线”信息 。
(2) 由于程序要对多个程序模块进行启动和停止 的调度 ,所以采用多线程技术 。设置如下几个线程 : 连接线程 、监听线程和新套接字收发线程 ,具体的线 程调度如图 1 所示 。
图 1 线程调度
(3) 监听线程中的 accept () 函数接收到连接 后 ,产生一个新的套接字 ,可利用该套接字与主叫方 通信 。原先用于监听的套接字必须要关闭 ,否则重新 启动监听线程时会出错 。
2 基于 TCP 协议的点对点通信实现方法
(1) 收发双发都设置两个 socket 。一个 socket 是 服务器型 socket ,绑定本地地址 ,监听对应的端口 ,收 到连接请求 ,则与要求连接的客户端进行信息交流 , 由于要模拟出“占线”的情况 ,该服务器型 socket 只能 与一 个 客 户 端 连 接 。另 外 一 个 socket 是 客 户 端 型 socket ,在发射方进行呼叫时 ,用 connect () 函数与接收 方的服务器型 socket 连接 ,由于要模拟出“占线”的情 况 ,在用 connect () 函数连接的同时 ,应停止本方的服 务器型 socket 监听 。
{ closesocket (dlg - > sock) ;/ / 若接收到连接后 ,则关闭原先 用于监听的套接字 AfxBeginThread( &thread2 ,0) ;/ / 启动新套接字收发线程 AfxEndThread(0) ;/ / 停止本方监听线程
}
}
②连接线程 :
UINT thread(LPVOID v)
return 0 ;
}
③新套接字收发线程 :
64
计 算 机 与 现 代 化
2005 年第 9 期
UINT thread2 (LPVOID p) { ... while (dlg - > s ! = SOCKET- ERROR) { / / 循环接收数据 dlg - > s = recv(dlg - > msgsock ,buff ,100 ,0) ; dlg - > SetForegroundWindow() ; if (dlg - > s ! = SOCKET- ERROR) { dlg - > m-list. InsertItem(dlg - > count + + ,buff) ; dlg - > m-list. Scroll (size) ; } } closesocket(dlg - > msgsock) ;/ / 若对方断开连接 ,则关闭 用于收发数据的 socket AfxBeginThread( &thread1 ,0) ;/ / 重新启动服务器 型 socket 的监听线程 AfxEndThread(0) ; / / 结束新套接字收发线程 }
A Point2to2point Communication Method Based on TCP Protocol
HUANG Huan1 ,HUANG Zan2
(1. Zhanjiang Ocean University ,Zhanjiang 524000 ,China ; 2. Zhanjiang Normal University ,Zhanjiang 524022 ,China)
(1) 在请求通话时 ,必须发送“请求通话”数据报 , 该数据报应包含“请求通话”报头 ,对方收到后 ,发回 一个“确认”数据报 ,表示同意建立呼叫 ,这样双方才 能建立通信 。
收稿日期 :2005204204 作者简介 :黄焕 (19772) ,男 (壮族) ,广东湛江人 ,湛江海洋大学航海学院助教 ,硕士 ,研究方向 :数字通信和信号处理 ;黄赞 (19712) ,男 ,广东湛江人 ,湛江师范学院信息科技学院工程师 、讲师 ,硕士 ,研究方向 :机电控制与先进制造技术 。
0 引 言
随着计算机网络的普及 ,通过网络进行信息交流 成为人们日常生活的一部分 ,为了保护自己的隐私 , 通过网络进行点对点的通信显得非常重要 。目前点 对点实时通信的软件很多 ,比如 NetMeeting、IPPhone 、 MediaRing 等等 ,这些软件都功能完善 、相对独立 ,但 不利于集成到自己开发的软件中 。有时为了把点对 点通信的功能集成到自己开发的软件当中 ,我们必须 自己动手编制程序 ,而选择基于何种协议的点对点通 信方式 ,是我们必须要考虑的问题 。在 TCP/ IP 协议 组中 ,TCP 是一种面向连接的协议 ,为用户提供可靠 的 、全双工的字节流服务 ,具有确认 、流控制 、多路复 用和同步功能 ,适于数据传输 。UDP 协议则是无连接 的 ,每个分组都携带完整的目的地址 ,各分组在系统 中独立传送 。它不能保证分组的先后顺序 ,不进行分 组出错的恢复与重传 ,因此 ,不保证传输的可靠性 。 但是 ,它提供高传输效率的数据报服务[1] ,大多数的
{ ... connect (dlg - > clisock , ( sockaddr 3 ) &( dlg - > cli) , sizeof (dlg - > cli) ) ;/ / 连接服务器端
... closesocket (dlg - > clisock) ;/ / 断开连接后 ,关闭 socket AfxBeginThread( &thread1 ,0) ;/ / 重新启动本方监听线程 AfxEndThread(0) ;/ / 断开连接后 ,则停止连接线程
(4) 由于双方在通信过程中 ,停止了监听线程 ,如 果其他终端用 connect ( ) 函数连接它们 ,连接不通会 返回错误信息 ,则表明对方正在通话 。
(5) 用 VC ++ 编制的程序关键代码如下 : ①服务器型 socket 的监听线程 :
UINT thread1 (LPVOID p)
{ ... dlg - > msgsock = accept ( dlg - > sock , ( sockaddr 3 ) &( dlg - > serv) , &(dlg - > addlen) ) ;/ / 等待连接 if (dlg - > msgsock = = INVALID- SOCKET) { dlg - > m-edit. SetWindowText (″Error accept″) ; } else / / 如果接收到连接
点对点通信的软件都是基于 UDP 协议的 ,如 PP 点点 通等等 。
1 基于 UDP 协议的点对点通信方式的 讨论
在一些特定的场合下 ,如某些模拟软件需要模拟 电传通信和电话通信的过程 ,双方要建立通信必须要 完成请求通话和互换应答码的“握手”过程 ,以及通信 过程中存在“占线”问题 ,即一旦线路连接 ,其他终端 对通信双方的呼叫都不能成功 。通信结束后 ,双方断 开连接 ,也需要信息交互 ,如果采用基于 UDP 协议的 编程模型 ,而且收发双方各自只设置一个 socket ,则从 建立通信线路 ,互发数据到结束通信 ,程序设计应能 完成以下过程 :
2005 年第 9 期 文章编号 :100622475 (2005) 0920062203
计算机与现代化 J ISUANJ I YU XIANDAIHUA
一种基于 TCP 协议的点对点通信方法
总第 121 期
黄 焕1 ,黄 赞2
(1. 湛江海洋大学 ,广东 湛江 524000 ;2. 湛江师范学院 ,广东 湛江 524022)
摘要 :首先分析了基于 UDP 协议和基于 TCP 协议的点对点通信方式的不同之处 ,并对两者进行了比较 ,然后重点介绍了 一种采用多线程技术的 、基于 TCP 协议的点对点通信的方法 。这一方法有效地保证了数据传输的可靠性 ,避免了对大量 数据报的判断过程 ,使程序更为简洁和稳定 ,效率更高 。 关键词 :UDP ;TCP ;点对点通信 ;多线程 中图分类号 :TN915. 04 ;TP393 文献标识码 :A
Abstract :This paper analyzes the differences between point2to2point communication methods based on UDP protocol and TCP protocol at first , and compares the two methods at the same time , then emphasizes to introduce a point2to2point communication method based on TCP protocol which adopts multi2thread technique. This method guarantees the reliability of data transmisLeabharlann Baiduion efficiently , avoids the judgment for the mass data and makes the program more succinct , steady and efficiency. Key words :UDP ;TCP ;point2to2point communication ;multi2thread