网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计下载 > 电气工程与自动化类别 > 正文

TCP/IP套接字编程的分析与实现

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

网学网电气工程与自动化类别编辑为广大网友搜集整理了:TCP/IP 套接字编程的分析与实现绩等信息,祝愿广大网友取得需要的信息,参考学习。

QQ交谈客服咨询,网学网竭诚为您服务,本站永久域名: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是作为两个独立的实体的,每个消息放在它自己的数据包里,如下所示:
 

Host A
Host B
 
M2
M1
 

 
 
 


 

 不幸的是,数据传输实际上有可能并不遵循这种模式。主机A上的应用程序调用send通常只是考贝数据到主机A的TCP/IP栈里然后返回。如果要发送数据的话,TCP就会决定将要立即发送多少出去。下图显示的是数据在主机A上被TCP打包的4种可能的方法:
 

 
M2
 
M1
 

 

 
M2
M1
 

 
 

 
M22
 
M21
M1
 

 
 

 
M2
M12
 
M11
 

 
 
从主机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
论文文章部分只是部分简介,如需了解更多详情请咨询本站客服!QQ交谈QQ3710167

设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师