网学网电气工程与自动化类别编辑为广大网友搜集整理了:TCP/IP 套接字编程的分析与实现绩等信息,祝愿广大网友取得需要的信息,参考学习。
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn | ||||||||||||||||||||||||||
第三章 为实现代理功能——底层socket编程的详细设计 基于H323协议的VoIP系统的信令通道和媒体通道的端口号都是动态分配的,防火墙无法对动态分配的端口号进行配置。因此要实现基于H323协议的双方能够进行通信,就必须使用代理服务-代理客户模式来穿越防火墙以及NAT路由。下面主要介绍代理的底层协议socket编程的详细设计: 下面1)~~5)在sockLib.h,socketLib.c中实现 1) 首先对socket的一些参数做以下设定: #define MAX_SOCKET_NUM 64 /*最多可同时开启的socket数量*/ #define MAX_PACKET_LEN 1024 /*一个最大的数据包的大小*/ #define THE_MAX_UNINTE_PACKET_AT_ONE_TIME 2 /*同时存在的收到tcp半包的socket连接的个数*/ #define CONNECT_TTL_TIME 100 /*十秒钟没有收到数据开始查询*/ #define CONNECT_IDLE_TIME 50 /*5秒钟没有收到查询结果释放连接*/ 这里先简单介绍一下tcp半包问题: TCP 是一个流协议(stream potocol),这意味着数据是作为字节流递交给接受者的,没有内在的消息 或消息边界的概念。从这方面来考虑,读TCP数据就象从一个串行端口读数据一样——读数据时永远也不知道一个给定的读调用将会返回多少个字节。 为了说明这一点,让我们假设主机A和主机B的应用程序之间有一个TCP连接,并且主机A上的应用程序发送消息给主机B。进一步假设主机A要发送两个消息,通过两次调用send来发送,没个消息调用一次。我们很自然地认为两个消息从主机A传送到主机B是作为两个独立的实体的,每个消息放在它自己的数据包里,如下所示:
不幸的是,数据传输实际上有可能并不遵循这种模式。主机A上的应用程序调用send通常只是考贝数据到主机A的TCP/IP栈里然后返回。如果要发送数据的话,TCP就会决定将要立即发送多少出去。下图显示的是数据在主机A上被TCP打包的4种可能的方法:
从主机B上的应用程序的观点来看,应用程序一次可能获得M1消息中的全部数据和M2中的全部数据;可能获得M1中的部分数据;可能获得M1中的全部数据以及M2中的全部数据;可能只获得M1中的数据。这就是所谓的TCP半包。 2) 把socket中的一些用到的结构体定义,以及socket.c中的函数都包含到socketLib.h中。对大型程序来说,当不同的源文件中用到同一类型数据(尤其是象数组,指针,结构体,共同体等类型数据)时,常用typedef定义一些类型并把它们放到一个文件中,另外把一些被其他模块调用的函数放到同一文件中,其他源文件中要调用时,用#include把他们包含进来。如下所示: typedef enum { e_rcv_qurey_confirm = 1, e_rcv_connect_request }SOCK_SOCK_SCAN_CMD; typedef enum { e_socket_num = 1, }SOCK_SOCK_SCAN_CELLID; fd_set g_sockMask; void initSockTalbe(void); STATUS getEmptySockTableElem(UINT16 * elemNo); STATUS getElemNumBySocket(SOCKET s, UINT16 * elemNo); STATUS isSocketInfoParamvValid(void * socketInfo); STATUS newSocket(void * socketInfo, UINT16 * socketTableNum); STATUS freeSocket(SOCKET s); 3) 初始化socketTable,并实现对socketTable进行操作的功能,函数实现如下: void initSockTalbe(void); STATUS getEmptySockTableElem(UINT16 * elemNo); STATUS getElemNumBySocket(SOCKET s, UINT16 * elemNo); STATUS isSocketInfoParamvValid(void * socketInfo); STATUS newSocket(void * socketInfo, UINT16 * socketTableNum); STATUS freeSocket(SOCKET s); void showSocket(void); | ||||||||||||||||||||||||||
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT | ||||||||||||||||||||||||||
本文选自计算机毕业设计http://myeducs.cn |