精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
这个部分描述QTSS的回调例程,模块可以调用这些例程来从服务器端获取信息,分配和回收内存,创建对象,设置属性值,以及管理客户及RTSP会话。回调例程组织为如下几个部分:
模块调用下面这些回调例程来注册角色,分配和释放内存,获取服务器内部定时器的值,以及将一个内部定时器的值转换为当前时间:
QTSS_AddRole |
增加一个角色。
QTSS_Error QTSS_AddRole(QTSS_Role inRole);
参数描述
inRole
输入参数,是一个类型为QTSS_Role的值,指定即将被加入的角色。
result
结果码。如果QTSS_AddRole函数在除了Register之外的角色中被调用,可能的返回值为QTSS_NoErr和QTSS_OutOfState;如果模块正在注册RTSP Request角色,而已经有一个模块注册了该角色,则返回QTSS_RequestFailed;如果指定的角色不存在,则返回QTSS_BadArgument。
讨论
QTSS_AddRole回调例程告诉服务器可以调用您的模块中由inRole参数指定的角色。
QTSS_AddRole回调例程只能在模块的Register角色中调用。对于当前版本的服务器,您可以增加下面这些角色:QTSS_ClientSessionClosing_Role,QTSS_ErrorLog_Role,QTSS_Initialize_Role, QTSS_OpenFilePreprocess_Role,QTSS_OpenFile_Role,QTSS_RTSPFilter_Role,QTSS_RTSPRoute_Role, QTSS_RTSPPreProcessor_Role,QTSS_RTSPRequest_Role,QTSS_RTSPPostProcessor_Role, QTSS_RTPSendPackets_Role,QTSS_RTCPProcess_Role,QTSS_Shutdown_Role。
QTSS_New |
分配内存。
void* QTSS_New(FourCharCode inMemoryIdentifier,UInt32 inSize);
参数描述
inMemoryIdentifier
输入参数,是一个类型为FourCharCode的值,与当前进行的内存分配操作相关联。服务器可以跟踪已分配的内存,使开发者更加容易调试内存泄露。
inSize
输入参数,是一个类型为UInt32的值,指定要分配的内存的字节数。
result
无。
讨论
QTSS_New回调例程用于分配内存。只要需要动态分配内存,QTSS模块就应该调用QTSS_New函数。
如果要删除QTSS_New分配的内存,请调用QTSS_Delete函数。
QTSS_Delete |
释放内存。
void* QTSS_Delete(void* inMemory);
参数描述
inMemory
输入参数,是一个指向任意值的指针,在这里指定即将被释放的内存的数量,以字节计。
result
无。
讨论
QTSS_Delete回调例程释放先前由QTSS_New函数分配的内存。
QTSS_Milliseconds |
获取服务器内部时钟的当前值。
QTSS_TimeVal QTSS_Milliseconds();
参数描述
result
服务器内部时钟的当前值,以毫秒计,从1970年1月1日午夜12点开始算起。
讨论
QTSS_Milliseconds回调例程用于获取服务器内部时钟当前值,从1970年1月1日午夜12点开始算起。如果没有特别的提醒,服务器属性中所有的毫秒值都是来自这个时钟。
QTSS_MilliSecsTo1970Secs |
将来自服务器内部时钟的时间值转换为当前时间。
time_t QTSS_MilliSecsTo1970Secs(QTSS_TimeVal inQTSS_Milliseconds);
参数描述
inQTSS_Milliseconds
输入参数,是一个类型为QTSS_TimeVal的值,通过调用QTSS_Milliseconds()函数得到。
result
类型为time_t的值,包含当前时间。
讨论
QTSS_MilliSecsto1970Secs回调例程将QTSS_Milliseconds函数得到的值转换为当前时间。
模块调用对象回调例程来操作对象。这些回调函数如下:
QTSS_CreateObjectType |
创建一个对象类型。
QTSS_Error QTSS_CreateObjectType(QTSS_ObjectType* outType);
参数描述
outType
输入参数,是一个指针,指向类型为QTSS_ObjectType的值。
result
结果码。可能的返回值之一是QTSS_NoErr,如果已经存在的对象类型太多,返回QTSS_FailedRequest,如果调用QTSS_CreateObjectType时指定名字的属性已经存在,则返回QTSS_OutOfState。
讨论
QTSS_CreateObjectType回调例程创建一个新的对象类型,并提供一个指向该类型的指针。可以通过调用QTSS_AddStaticAttribute函数来将静态属性添加到该对象类型中,实例属性则可以加入到这个新建对象类型的对象实例中。
QTSS_AddStaticAttribute回调例程只能在Register角色中调用。通过QTSS_SetValue函数可以设置已添加属性的值,通过QTSS_RemoveValue函数则可以删除已添加的属性。
这个回调函数只能在Register角色中调用。
QTSS_CreateObjectValue |
创建一个新的对象,其值将作为另一对象的属性值。
QTSS_Error QTSS_CreateObjectValue(QTSS_Object inObject,
QTSS_AttributeID inID,QTSS_ObjectType inType,UInt32* outIndex,QTSS_Object* outCreatedObject);
参数描述
inObject
输入参数,是一个指针,指向类型为QTSS_ObjectType的值,该值指定了一个对象,本函数创建的对象将成为该对象的属性值。
inID
输入参数,是一个类型为QTSS_AttributeID的值,指定一个属性ID,本函数创建的对象将被设置为这个ID对应的属性的值。
inType
输入参数,是一个类型为QTSS_ObjectType的值,指定即将创建的对象的对象类型。
outIndex
输出参数,是一个指针,指向类型为UInt32的值,该值包含被创建对象的索引。
outCreatedObject
输出参数,是一个指针,指向类型为QTSS_ObjectTypes的值,即新创建的对象。
result
结果码。可能的返回值之一是QTSS_NoErr,如果参数不正确,返回QTSS_BadArgument,如果inID参数指定的属性为只读属性,则返回QTSS_ReadOnly。
讨论
QTSS_CreateObjectValue回调例程创建一个对象,并将该对象设置为某个现有对象的属性值。由inObject指定的对象为“父”对象。
如果inObject参数指定的对象在之后被QTSS_LockObject函数锁住了,则outCreatedObject参数指定的对象也会被锁住。
QTSS_LockObject |
锁定一个对象。
QTSS_Error QTSS_LockObject(QTSS_Object inObject);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定即将被锁定的对象。
result
结果码。可能的返回值之一是QTSS_NoErr,如果指定的对象实例不存在,则返回QTSS_BadArgument。
讨论
QTSS_LockObject回调例程锁定指定的对象,使其它线程对该对象属性的访问被阻塞。在对被属性指向的变量执行非原子更新—比如调用QTSS_SetValuePtr函数来设定属性值—或者获取非抢占访问安全的属性值之前,请调用QTSS_LockObject函数。
调用QTSS_UnLockObject函数来为对象解除锁定。
由QTSS_CreateObjectValue函数创建的对象在其父对象被锁定的时候也会被锁定。
QTSS_UnLockObject |
解锁一个对象。
QTSS_Error QTSS_UnLockObject(QTSS_Object inObject);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定即将被解锁的对象。
result
结果码。可能的返回值之一是QTSS_NoErr,如果指定的对象实例不正当,则返回QTSS_BadArgument。
讨论
QTSS_UnLockObject回调例程对先前被QTSS_LockObject函数加锁的对象进行解锁。
模块调用属性回调函数来操作属性。属性回调函数列举如下:
QTSS_AddInstanceAttribute |
向对象的实例中添加一个实例属性。
QTSS_Error QTSS_AddInstanceAttribute(QTSS_Object inObject,char* inAttrName,
void* inUnused,QTSS_AttrDataType inAttrDataType);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定即将添加实例属性的对象。
inAttrName
输入参数,是一个指向字节数组的指针,表示即将添加的属性名称。
inUnused
总是为NULL。
QTSS_AttrDataType
输入参数,是一个类型为QTSS_AttrDataType的值, 指定即将添加的属性的数据类型。
result
结果码。可能的返回值之一是QTSS_NoErr;如果QTSS_AddInstanceAttribute函数在除了Register角色之外的其它角色中调用,返回QTSS_OutOfState;如果指定的对象类型不存在,属性名称太长,或者某个参数没有指定,返回QTSS_BadArgument;如果指定名称的属性已经存在,则返回QTSS_AttrNameExists。
讨论
QTSS_AddInstanceAttribute回调例程向inObject参数指定的对象实例添加一个属性。这个回调函数只能在Register角色中调用。
在往模块创建的对象添加属性时,您必须首先调用QTSS_LockObject函数来锁定对象,然后进行属性的添加,最后调用QTSS_UnLockObject函数。
所有已添加的实例属性的值都是可读,可写,和抢占访问安全的,因此可以调用QTSS_GetValueAsString和QTSS_GetValuePtr函数来访问。您也可以调用QTSS_GetValue函数来获取已经添加的静态属性值,但是这样做效率比较低。
添加静态属性比添加实例属性效率更高,因此我们强烈推荐添加静态属性,而不是动态属性。
典型情况下,模块在首次安装的时候进行实例属性的添加,并调用QTSS_SetValue函数来设定属性值,以便将缺省的预置信息设置到模块的预置对象中。在服务器随后的运行过程中,预置信息就已经存在于相应的模块预置对象中了,因此模块只需要调用QTSS_GetValue,QTSS_GetValueAsString,或者QTSS_GetValuePtr函数来获取预置的值就可以了。调用QTSS_GetValuePtr函数来获取属性值是最为有效和推荐的方法,调用QTSS_GetValue函数比调用QTSS_GetValuePtr函数效率低一些,而调用QTSS_GetValueAsString函数又比调用QTSS_GetValue函数效率低。
调用QTSS_RemoveValue函数可以删除已添加完成的属性的值。
和静态属性不同,实例属性是可以被删除的。调用QTSS_RemoveInstanceAttribute函数可以将对象实例的实例属性删除。
QTSS_AddStaticAttribute |
向对象类型中添加一个静态属性。
QTSS_Error QTSS_AddStaticAttribute(QTSS_ObjectType inObjectType,const char* inAttributeName,void* inUnused,QTSS_AttrDataType inAttrDataType);
参数描述
inType
输入参数,是一个类型为QTSS_ObjectType的值,指定即将添加属性的对象类型。
inAttributeName
输入参数,是一个指向字节数组的指针,表示即将添加的属性名称。
inUnused
总是为NULL。
QTSS_AttrDataType
输入参数,是一个类型为QTSS_AttrDataType的值, 指定即将添加的属性的数据类型。
result
结果码。可能的返回值之一是QTSS_NoErr;如果QTSS_AddStaticAttribute函数在除了Register角色之外的其它角色中调用,返回QTSS_OutOfState;如果指定的对象类型不存在,属性名称太长,或者某个参数没有指定,返回QTSS_BadArgument;如果指定名称的属性已经存在,则返回QTSS_AttrNameExists。
讨论
QTSS_AddStaticAttribute回调例程向inType参数指定的对象类型的所有对象加入指定的属性。这个回调函数只能在Register角色中调用。静态属性一旦被加入,就不能在服务器运行的过程中删除。
在往模块创建的对象添加属性时,您必须首先调用QTSS_LockObject函数来锁定对象,然后进行属性的添加,最后调用QTSS_UnLockObject函数。
添加静态属性比添加实例属性效率更高,因此我们强烈推荐添加静态属性,而不是动态属性。
所有添加了的静态属性的值都是可读,可写,和抢占访问安全的,可以调用QTSS_SetValue或者QTSS_SetValuePtr函数来设定属性的值。
可以调用QTSS_GetValuePtr,QTSS_GetValue或者QTSS_GetValueAsString函数来获取添加完成的静态属性值。调用QTSS_GetValuePtr函数来获取属性值是最为有效和推荐的方法,调用QTSS_GetValue函数比调用QTSS_GetValuePtr函数效率低一些,而调用QTSS_GetValueAsString函数又比调用QTSS_GetValue函数效率低。
调用QTSS_RemoveValue函数可以删除已添加的静态属性的值。
QTSS_GetAttrInfoByID |
通过属性ID得到属性的信息。
QTSS_Error QTSS_GetAttrInfoByID(QTSS_Object inObject,QTSS_AttributeID inAttrID,QTSS_AttrInfoObject* outAttrInfoObject);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定被查询的属性所在的对象。
inAttrID
输入参数,是一个类型为QTSS_AttributeID的值,指定被查询的属性。
outAttrInfoObject
输出参数,是一个指针,指向类型为QTSS_AttrInfoObject的值,用于存放由inAttrID参数指定的属性的信息。
result
结果码。可能的返回值之一是QTSS_NoErr;如果指定的对象不存在,返回QTSS_BadArgument;如果指定的属性不存在,则返回QTSS_AttrDoesntExist。
讨论
QTSS_GetAttrInfoByID回调例程通过一个属性ID获得一个QTSS_AttrInfoObject对象,该对象可用于获取属性名称,属性的数据类型,读写属性值的权限,以及获取属性值的操作是否抢占访问安全等信息。
QTSS_GetAttrInfoByIndex |
通过遍历获取某个对象的所有属性信息。
QTSS_Error QTSS_GetAttrInfoByIndex(QTSS_Object inObject,UInt32 inIndex,QTSS_AttrInfoObject* outAttrInfoObject);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定被查询的属性信息所属的对象。
inIndex
输入参数,是一个类型为UInt32的值,指定被查询的属性的索引。在开始遍历时将inIndex设置为0,在下次调用QTSS_GetAttrInfoByIndex函数的时候,将inIndex递加1,以获取下一个属性的信息。调用QTSS_GetNumAttributes函数可以获得inObject对象中具有的属性数量。
outAttrInfoObject
输出参数,是一个指针,指向类型为QTSS_AttrInfoObject的值,可以通过这种对象取得由inAttrName参数指定的属性的信息。
result
结果码。可能的返回值之一是QTSS_NoErr;如果指定的对象不存在,返回QTSS_BadArgument;如果属性不存在,则返回QTSS_AttrDoesntExist。
讨论
QTSS_GetAttrInfoByIndex回调例程通过一个属性ID得到一个QTSS_AttrInfoObject对象,可以通过该对象取得属性的名称和ID,属性的数据类型,以及读写属性值的权限。
无论对于静态属性还是实例属性,QTSS_GetAttrInfoByIndex回调例程都返回QTSS_AttrInfoObject类型的值。
QTSS_GetAttrInfoByName |
通过属性名称获取属性的信息。
QTSS_Error QTSS_GetAttrInfoByName(QTSS_Object inObject,char* inAttrName,QTSS_AttrInfoObject* outAttrInfoObject);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定被查询的属性信息所属的对象。
inAttrName
输入参数,是一个指针,指向一个C字符串,该字符串中包含被查询的属性的名称。
outAttrInfoObject
输出参数,是一个指针,指向类型为QTSS_AttrInfoObject的值,可以通过这种对象取得由inAttrName参数指定的属性的信息。
result
结果码。可能的返回值之一是QTSS_NoErr;如果指定的对象不存在,返回QTSS_BadArgument;如果属性不存在,则返回QTSS_AttrDoesntExist。
讨论
QTSS_GetAttrInfoByName回调例程通过属性名称得到一个QTSS_AttrInfoObject对象,可以通过该对象取得属性的名称和ID,属性的数据类型,读写属性值的权限,以及获取属性值的操作是否抢占访问安全。
无论对于静态属性还是实例属性,QTSS_GetAttrInfoByName回调例程都返回QTSS_AttrInfoObject类型的值。
QTSS_GetNumAttributes |
获取对象的属性数目。
QTSS_Error QTSS_GetNumAttributes(QTSS_Object inObject,UInt32* outNumAttributes);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定要计数的属性所属的对象。
outNumAttributes
输出参数,是一个指针,指向类型为UInt32的值,该值包含对象属性的数目。
result
结果码。可能的返回值之一是QTSS_NoErr;如果指定的对象不存在,返回QTSS_BadArgument。
讨论
QTSS_GetNumAttributes回调例程获取由inObject参数指定的对象的属性数目。有了属性数目,您就可以知道在获取对象的所有属性信息时应该调用QTSS_GetAttrInfoByIndex函数的次数。
QTSS_GetValue |
将属性值拷贝到一个缓冲区中。
QTSS_Error QTSS_GetValue (QTSS_Object inObject,QTSS_AttributeID inID,UInt32 inIndex,
void* ioBuffer,Int32* ioLen);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定要得到的属性值所属的对象。
inID
输入参数,是一个类型为QTSS_AttributeID的值,指定被查询的属性的ID。
inIndex
输入参数,是一个类型为UInt32的值,指定要获取哪个属性值(如果属性可能有多个值的话);对于单值属性,这个参数为0。
ioBuffer
作为输入参数,是一个缓冲区的指针;作为输出参数,ioBuffer中含有由inID参数指定的属性的值。如果缓冲区太小,不能容纳相应的值,则ioBuffer为空。
ioLen
作为输入参数,是一个类型为UInt32的值,指定ioBuffer的长度。作为输出参数,ioLen包含ioBuffer缓冲区中有效数据的长度。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,返回QTSS_BadArgument;如果由inIndex指定的索引不存在,返回QTSS_BadIndex;如果属性值的长度比ioLen参数指定的长,返回QTSS_NotEnoughSpace;如果属性不存在,则返回QTSS_AttrDoesntExist。
讨论
QTSS_GetValue回调例程将指定的属性值拷贝到一个例程外部提供的缓冲区中。
调用QTSS_GetValue函数比调用QTSS_GetValuePtr函数速度慢,效率低。
QTSS_GetValueAsString |
获取属性值,并转换为C字符串。
QTSS_Error QTSS_GetValueAsString (QTSS_Object inObject,QTSS_AttributeID inID,UInt32 inIndex,char** outString);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定要得到的属性值所属的对象。
inID
输入参数,是一个类型为QTSS_AttributeID的值,指定被查询的属性的ID。
inIndex
输入参数,是一个类型为UInt32的值,指定要获取哪个属性值(如果属性可能有多个值的话);对于单值属性,这个参数为0。
outString
作为输入参数,是一个内存地址指针;作为输出参数,outString指向由inID指定的属性的值,格式为字符串。
result
结果码。可能的返回值之一是QTSS_NoErr;如果某个参数不正当,返回QTSS_BadArgument;如果由inIndex指定的索引不存在,返回QTSS_BadIndex。
讨论
QTSS_GetValueAsString回调例程获取指定属性的值,并转换为C字符串格式,存储在由outString参数指定的内存位置上。
当您不再需要outString时,需要调用QTSS_Delete函数来释放为其分配的内存。
QTSS_GetValueAsString回调例程既可以用来获取抢占访问安全的属性的值,也可以用于访问非抢占访问安全的属性。然而,调用QTSS_GetValueAsString函数的效率比调用QTSS_GetValue函数低,而调用QTSS_GetValue函数又比调用QTSS_GetValuePtr函数效率低。
调用QTSS_GetValue函数是获取非抢占访问安全的属性值的推荐方法,而调用QTSS_GetValuePtr函数则是获取抢占访问安全的属性值的推荐方法。
QTSS_GetValuePtr |
获取一个指向属性值的指针。
QTSS_Error QTSS_GetValuePtr (QTSS_Object inObject,QTSS_AttributeID inID,UInt32 inIndex,void** outBuffer,UInt32* outLen);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定要获取的属性值所属的对象。
inID
输入参数,是一个类型为QTSS_AttributeID的值,指定被查询的属性的ID。
inIndex
输入参数,是一个类型为UInt32的值,指定要获取哪个属性值(如果属性可能有多个值的话);对于单值属性,这个参数为0。
outBuffer
作为输入参数,是一个内存地址指针;作为输出参数,outBuffer指向由inID指定的属性的值。
outLen
输出参数,是一个指针,指向类型为UInt32的值,表示outBuffer指向的有效字节数。
result
结果码。可能的返回值之一是QTSS_NoErr;如果inID指定的属性不是抢占访问安全的,返回QTSS_NotPreemptiveSafe;如果参数不正当,返回QTSS_BadArgument;如果由inIndex指定的索引不存在,返回QTSS_BadIndex;如果属性不存在,则返回QTSS_AttrDoesntExist。
讨论
QTSS_GetValuePtr回调例程获取一个指向属性值的指针。调用QTSS_GetValuePtr函数是最快和最有效的获取属性值的方法,并且产生错误的可能性较少。
在调用QTSS_GetValuePtr函数获取非抢占访问安全的属性值之前,您必须调用QTSS_LockObject函数来锁定对象,在得到值之后,调用QTSS_UnLockObject函数进行解锁。
如果您在获取非抢占访问安全的属性值时,不希望锁定和解锁对象,则可以改用QTSS_GetValue或者QTSS_GetValueAsString函数来获取属性值。
QTSS_IDForAttr |
获取静态属性的ID。
QTSS_Error QTSS_IDForAttr(QTSS_ObjectType inType,const char* inAttributeName,QTSS_AttributeID* outID);
参数描述
inType
输入参数,是一个类型为QTSS_ObjectType 的值,指定即将获取的属性ID所在的对象类型。
inAttributeName
输入参数,是一个指向字节数组的指针,表示即将获取的ID所在的属性的名称。
outID
作为输入参数,是一个指针,指向类型为QTSS_AttributeID的值;作为输入参数,outID包含由inAttributeName参数指定的属性的ID。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正确,返回QTSS_BadArgument。
讨论
QTSS_IDForAttr回调例程从指定的对象类型中获取指定的静态属性ID。属性ID在调用QTSS_GetValue,QTSS_GetValueAsString,和QTSS_GetValuePtr函数获取属性值时可以使用。
如果需要获取实例属性的ID,请调用QTSS_GetAttrInfoByName或者QTSS_GetAttrInfoByIndex函数。
QTSS_RemoveInstanceAttribute |
从一个对象实例中删除一个实例属性。
QTSS_Error QTSS_RemoveInstanceAttribute(QTSS_Object inObject,QTSS_AttributeID inID);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定即将被删除的实例属性所在的对象。
inID
输入参数,是一个类型为QTSS_AttributeID的值,指定即将被删除的属性的ID。
result
结果码。可能的返回值之一是QTSS_NoErr;如果指定的对象实例不存在,返回QTSS_BadArgument;如果属性不存在,则返回QTSS_AttrDoesntExist。
讨论
QTSS_RemoveInstanceAttribute回调例程从inObject参数指定的对象中删除由inID参数指定的实例属性。
QTSS_RemoveInstanceAttribute回调例程可以在所有的角色中调用。
QTSS_RemoveValue |
从一个属性中删除指定的值。
QTSS_Error QTSS_RemoveValue (QTSS_Object inObject,QTSS_AttributeID inID,UInt32 inIndex);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定即将删除属性值的属性所在的对象。
inValueLen
输入参数,是一个类型为QTSS_AttributeID的值,包含一个属性ID,这个ID对应的属性的值即将被删除。
inIndex
输入参数,是一个类型为UInt32的值,指定要被删除的属性值。属性值的索引是从0开始的数字。
result
结果码。可能的返回值之一是QTSS_NoErr;如果InObject,inID,或者inIndex参数包含的值无效,返回QTSS_BadArgument;如果属性是只读的,返回QTSS_ReadOnly ;如果指定的属性不存在,则返回QTSS_BadIndex。
讨论
QTSS_RemoveValue回调例程删除指定属性的值。在删除之后,剩下的属性值会重新编号。
QTSS_SetValue |
设置一个属性的值。
QTSS_Error QTSS_SetValue (QTSS_Object inObject,QTSS_AttributeID inID,UInt32 inIndex,const void* inBuffer,UInt32 inLen);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定即将设定属性值的属性所在的对象。
inID
输入参数,是一个类型为QTSS_AttributeID的值,指定被设置属性值的属性的ID。
inIndex
输入参数,是一个类型为UInt32的值,指定将要设置哪个属性值(如果该属性可能有多个值的话),对于单值属性,这个参数为0。
inBuffer
输入参数,是一个缓冲区指针,包含用于设置的值。在QTSS_SetValue函数返回之后,您就可以释放inBuffer指向的缓冲区。
inLen
输入参数,是一个类型为UInt32的值,指定inBuffer中有效数据的长度。
result
结果码。可能的返回值之一是QTSS_NoErr;如果由inIndex指定的索引不存在,返回QTSS_BadIndex;如果参数不正当,返回QTSS_BadArgument;如果属性为只读,返回QTSS_ReadOnly;如果属性不存在,则返回QTSS_AttrDoesntExist。
讨论
QTSS_SetValue回调例程显式设置指定属性的值。另外一种设置属性值的方法是调用QTSS_SetValuePtr函数
QTSS_SetValuePtr |
将已经存在的变量设置为一个属性的值。
QTSS_Error QTSS_SetValue (QTSS_Object inObject,QTSS_AttributeID inID,const void* inBuffer,
UInt32 inLen);
参数描述
inObject
输入参数,是一个类型为QTSS_Object的值,指定即将设定属性值的属性所在的对象。
inID
输入参数,是一个类型为QTSS_AttributeID的值,指定被设置属性值的属性的ID。
inBuffer
输入参数,是一个缓冲区指针,包含用于设置的值。
inLen
输入参数,是一个类型为UInt32的值,指定inBuffer中有效数据的长度。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,返回QTSS_BadArgument;如果属性为只读,则返回QTSS_ReadOnly。
讨论
QTSS_SetValuePtr回调例程使模块可以将属性值设置为模块变量的值。它是QTSS_SetValue回调例程的另一个选择。
在调用QTSS_SetValuePtr函数之后,模块必须保证如果inID指定的属性存在,则inBuffer指定的缓冲区也存在。
如果inBuffer指向的缓冲区没有以原子操作的方式更新,则在更新inBuffer缓冲区之前,应该调用QTSS_LockObject函数来进行保护。
QTSS_StringToValue |
将一个C字符串格式的属性数据类型转换为一个QTSS_AttrDataType格式的值。
QTSS_Error QTSS_StringToValue(const char* inValueAsString,const QTSS_AttrDataType inType,void* ioBuffer,UInt32* ioBufSize);
参数描述
inValueAsString
输入参数,是一个字符数组的指针,数组中含有即将被转换的值。
inType
输入参数,是一个类型为QTSS_AttrDataType的值,指定一个属性数据类型,inValueAsString参数指向的值将被转换为这种数据类型。
ioBuffer
作为输入参数,是一个缓冲区的指针;作为输出参数,该缓冲区中含有从inValueAsString参数转换得到的属性数据类型。上层模块必须在调用QTSS_StringToValue函数之前为ioBuffer分配内存。
ioBufSize
作为输入参数,是一个类型为UInt32的值,指定ioBuffer缓冲区的长度。作为输出参数,ioBufSize指向ioBuffer中有效数据的长度。
result
结果码。可能的返回值之一是QTSS_NoErr;如果inValueAsString或者inType参数没有包含有效值,返回QTSS_BadArgument;如果ioBuffer指向的缓冲区太小,不能容纳转换后的值,则返回QTSS_NotEnoughSpace。
讨论
QTSS_StringToValue回调例程将一个C字符串格式的属性数据类型转换为一个QTSS_AttrDataType格式的值。
当不再需要ioBuffer指向的缓冲区时,应该释放相应的内存。
QTSS_TypeStringToType |
根据C字符串格式的数据类型串得到相应的属性数据类型。
QTSS_Error QTSS_TypeStringToType(const char* inTypeString,QTSS_AttrDataType* outType);
参数描述
inTypeString
输入参数,是一个指向字符数组的指针,数组中含有C字符串格式的属性数据类型。
outType
输出参数,是一个指针,指向类型为QTSS_AttrDataType值,该值中含有属性数据类型。
result
结果码。可能的返回值之一是QTSS_NoErr;如果inTypeString参数中没有包含可返回属性数据类型的值,则返回QTSS_BadArgument。
讨论
QTSS_TypeStringToType回调例程根据C字符串格式的数据类型串得到相应的属性数据类型。
QTSS_TypeToTypeString |
获取属性数据类型的C字符串格式的名称。
QTSS_Error QTSS_TypeToTypeString(constQTSS_AttrDataType inType,char** outTypeString);
参数描述
inType
输入参数,是一个指针,指向类型为QTSS_AttrDataType的值,该值中包含即将以C字符串格式返回的属性数据类型。
outType
作为输入参数,是一个指向内存地址的指针;作为输出参数,outType指向一个包含属性数据类型的C字符串。
result
结果码。可能的返回值之一是QTSS_NoErr;如果inType参数没有包含正当的属性数据类型,则返回QTSS_BadArgument。
讨论
QTSS_TypeToTypeString回调例程从QTSS_AttrDataType格式的值中获取其C字符串格式的名称。
QTSS_ValueToString |
将一个格式为QTSS_AttrDataType的属性数据类型转换为C字符串格式的值。
QTSS_Error QTSS_ValueToString(const void* inValue,const UInt32 inValueLen,const QTSS_AttrDataType inType,char** outString);
参数描述
inValue
输入参数,是一个缓冲区指针,该缓冲区中含有即将从QTSS_AttrDataType格式转换为C字符串的值。.
inValueLen
输入参数,是一个类型为UInt32的值,指定inValue参数指向的值的长度。
inType
输入参数,是一个类型为QTSS_AttrDataType的值,指定inValue参数指向的值的属性数据类型。
outString
输出参数,是一个指向内存位置的指针,该内存中含有C字符串格式的属性数据类型。
result
结果码。可能的返回值之一是QTSS_NoErr;如果inValue,inValueLen,或者inType参数中不包含正当值,则返回QTSS_BadArgument。
讨论
QTSS_ValueToString回调例程将一个格式为QTSS_AttrDataType的属性数据类型转换为C字符串格式的值
本部分描述模块对流执行I/O时使用的回调例程。服务器在内部以异步的方式执行 I/O,因此如果没有特别提到的话,QTSS流回调例程不能阻塞,如果数据不能被写入,则返回QTSS_WouldBlock。流回调例程列举如下:
QTSS_Advise |
通知文件系统模块流的指定部分很快将会被读取。
QTSS_Error QTSS_Advise(QTSS_StreamRef inRef,UInt64 inPosition,UInt32 inAdviseSize);
参数描述
inRef
输入参数,是一个类型为QTSS_StreamRef的值,指定一个流,可以通过调用QTSS_OpenFileObject函数来得到。
inPosition
输入参数,相对于流的起始位置的字节偏移量,表示即将被读取的部分的起始点。
inAdviseSize
输入参数,即将被读取的部分的字节长度。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,返回QTSS_BadArgument;也可能返回QTSS_RequestFailed。
讨论
QTSS_Advise回调例程通知文件系统模块指定部分的流很快将会被读取。文件系统模块可能会率先读取,以便在未来调用QTSS_Read读取指定流的时候能够更快地响应。
QTSS_Read |
从一个流中读取数据。
QTSS_Error QTSS_Read(QTSS_StreamRef inRef,void* ioBuffer,UInt32 inBufLen, UInt32* outLengthRead);
参数描述
inRef
输入参数,是一个类型为QTSS_StreamRef的值,指定即将读取数据的流。调用QTSS_OpenFileObject函数可以得到您希望读取的文件的流引用。
ioBuffer
输入参数,是一个指针,指向存放读取数据的缓冲区。
inBufLen
输入参数,是一个类型为UInt32的值,指定ioBuffer缓冲区的长度。
outLenRead
输出参数,是一个指针,指向类型为UInt32的值,表示读取的字节数。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,返回QTSS_BadArgument;如果读操作被阻塞,则返回QTSS_WouldBlock;如果读操作失败,则返回QTSS_RequestFailed。
讨论
QTSS_Read回调例程从一个流中读取数据,放入缓冲区。
QTSS_Seek |
设置流的位置。
QTSS_Error QTSS_Seek(QTSS_StreamRef inRef,UInt64 inNewPosition);
参数描述
inRef
输入参数,是一个类型为QTSS_StreamRef的值,指定即将设置位置的流。调用QTSS_OpenFileObject函数可以得到流引用。
inNewPosition
输入参数,是一个相对于流起始位置的字节偏移量,流将会被设置到这个位置上。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,返回QTSS_BadArgument;如果定位操作失败,则返回QTSS_RequestFailed。
讨论
QTSS_Seek回调例程将一个流设置到inNewPosition参数指定的位置上。
QTSS_RequestEvent |
请求当指定事件发生时得到通知。
QTSS_Error QTSS_RequestEvent(QTSS_StreamRef inStream,QTSS_EventType inEventMask);
参数描述
inStream
输入参数,是一个类型为QTSS_StreamRef的值,例程请求的就是这个参数指定的流的事件通知。
inEventMask
输入参数,是一个类型为QTSS_EventType的值,指定一个掩码,例程请求的就是该掩码代表的事件的通知。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,返回QTSS_BadArgument;如果调用失败,则返回QTSS_RequestFailed。
讨论
QTSS_RequestEvent回调例程使调用者在指定流的指定事件发生时得到通知。在调用QTSS_RequestEvent函数之后,上层模块应该从当前的模块角色中尽快返回。服务器保留上层模块的当前状态,当事件发生时,服务器以调用QTSS_RequestEvent函数时所在的角色调用相应的模块。
QTSS_SignalStream |
当流变为可进行I/O操作的状态时,将这个状态变化信息通知事件的接收方。
QTSS_Error QTSS_SignalStream(QTSS_StreamRef inStream,QTSS_EventType inEventMask);
参数描述
inStream
输入参数,是一个类型为QTSS_StreamRef的值,表示状态发生变化(变为可进行I/O操作)的流。
inEventMask
输入参数,是一个类型为QTSS_EventType的值,它指定一个掩码,表示流是否变为可读,可写,或者可读写。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,返回QTSS_BadArgument;如果这个函数在不允许异步事件的角色中调用,返回QTSS_OutOfState;如果调用失败,则返回QTSS_RequestFailed。
讨论
QTSS_SignalStream回调例程告诉服务器inStream表示的流可以进行I/O操作了。目前只有文件系统模块有理由调用QTSS_SignalStream函数。
QTSS_Write |
向一个流写入数据。
QTSS_Error QTSS_Write(QTSS_StreamRef inRef,void* inBuffer,UInt32 inLen,UInt32* outLenWritten,UInt32 inFlags);
参数描述
inRef
输入参数,是一个类型为QTSS_StreamRef的值,指定即将写入数据的流。
inBuffer
输入参数,是一个缓冲区指针,指向即将写入的数据。
inLen
输入参数,是一个类型为UInt32的值,指定inBuffer缓冲区中数据的长度。
outLenWritten
输出参数,是一个指针,指向类型为UInt32的值,表示即将写入的字节数。
inFlags
输入参数,是一个类型为UInt32的值,可能的值请参见讨论部分。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,返回QTSS_BadArgument;如果流的接受方已经不再处于连接状态,返回QTSS_NotConnected;如果流的缓冲数据在这个时刻不能完全被写入,则返回QTSS_WouldBlock。
讨论
QTSS_Write回调例程将一个缓冲区中的数据写入到一个流。
下面的枚举定义了inFlags参数可能的常数值:
enum
{
qtssWriteFlagsIsRTP = 0x00000001,
qtssWriteFlagsIsRTCP= 0x00000002
};
在向RTP流写入数据的时候,这些标志是相互关联的,它们告诉服务器写入的数据应该通过RTP通道(qtssWriteFlagsIsRTP)发送,还是应该通过指定RTP流的RTCP通道发送(qtssWriteFlagsIsRTCP)。
QTSS_WriteV |
通过iovec结构将数据写入到流中。
QTSS_Error QTSS_WriteV(QTSS_StreamRef inRef,iovec* inVec,UInt32 inNumVectors,UInt32 inTotalLength,UInt32* outLenWritten);
参数描述
inRef
输入参数,是一个类型为QTSS_StreamRef的值,指定即将写入数据的流。
inVec
输入参数,是一个指向iovec结构的指针。iovec结构的第一个成员必须为空。
inNumVectors
输入参数,是一个类型为UInt32的值,指定向量的数目。
inTotalLength
输入参数,是一个类型为UInt32的值,指定inVec的总长度。
outLenWritten
输出参数,是一个指针,指向类型为UInt32的值,表示被写入的字节数。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数为NULL,返回QTSS_BadArgument;如果写操作即将被阻塞,则返回QTSS_WouldBlock。
讨论
QTSS_WriteV回调例程通过iovec结构将数据写入到流中,其方式类似于POSIX的writev调用。
QTSS_Flush |
强制执行一个立即写操作。
QTSS_Error QTSS_Flush(QTSS_StreamRef inRef);
参数描述
inRef
输入参数,是一个类型为QTSS_StreamRef的值,指定即将对缓冲数据进行写操作的流。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数为NULL,返回QTSS_BadArgument;如果流的缓冲数据在这个时刻不能完全被写入,则返回QTSS_WouldBlock。
讨论
QTSS_Flush回调例程强行对流的任何缓冲数据执行立即写操作。某些流引用,比如QTSSRequestRef,在发送数据之前先进行缓冲。
模块可以将本部分描述的回调例程用于打开和关闭一个文件对象。
QTSS_OpenFileObject |
打开一个文件。
QTSS_Error QTSS_OpenFileObject(char* inPath,QTSS_OpenFileFlags inFlags,QTSS_Object* outFileObject);
参数描述
inPath
输入参数,是一个以null结尾的C字符串,表示即将被打开的文件在本地文件系统中的全路径。
inFlags
输入参数,是一个类型为QTSS_OpenFileFlags的值,指定描述如何打开文件的标志。
outFileObject
输出参数,是一个指针,指向类型为QTSS_Object的值,打开后的文件对应的文件对象将存放在这里。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,返回QTSS_BadArgument;如果指定的文件不存在,则返回QTSS_FileNotFound。
讨论
QTSS_OpenFileObject回调例程打开指定的文件并返回相应的文件对象。文件对象的属性之一是一个流引用,可以传递给QTSS流回调例程,以便读写文件数据,或者执行其它文件操作。
QTSS_CloseFileObject |
关闭一个文件。
QTSS_Error QTSS_CloseFileObject(QTSS_Object inFileObject);
参数描述
inFileObject
输入参数,是一个类型为QTSS_Object的值,表示即将被关闭的文件。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,返回QTSS_BadArgument。
讨论
QTSS_CloseFileObject回调例程用于关闭指定的文件。
模块可以通过本部分描述的回调例程来注册和调用服务。服务回调例程如下:
QTSS_AddService |
增加一个服务。
QTSS_Error QTSS_AddService(const char* inServiceName,QTSS_ServiceFunctionPtr inFunctionPtr);
参数描述
inServiceName
输入参数,是一个字符串指针,包含即将新增的服务的名称。
inFunctionPtr
输入参数,是一个指针,指向提供新增服务的代码模块。
result
结果码。可能的返回值之一是QTSS_NoErr;如果QTSS_AddService不是在Register角色中被调用,返回QTSS_OutOfState;如果inServiceName太长,或者某个参数为NULL,则返回QTSS_BadArgument。
讨论
QTSS_AddService回调例程使指定的服务可以被其它模块调用。
这个回调函数只能在Register角色中调用。
QTSS_IDForService |
通过解析服务的名称得到服务ID。
QTSS_Error QTSS_IDForService(const char* inTag,QTSS_ServiceID* outID);
参数描述
inTag
输入参数,是一个字符串指针,包含被解析的服务名称。
outID
作为输入参数,是一个指针,指向类型为QTSS_ServiceID的值;作为输出参数,QTSS_ServiceID含有由inTag参数指定的服务的ID。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,则返回QTSS_BadArgument。
讨论
QTSS_IDForService回调例程通过outID参数返回由inTag参数指定的服务的ID。您可以以这个服务ID为参数调用QTSS_DoService函数,来激活serviceID代表的服务。
QTSS_DoService |
激活一个服务。
QTSS_Error QTSS_DoService(QTSS_ServiceID inID,QTSS_ServiceFunctionArgsPtr inArgs);
参数描述
inID
输入参数,是一个类型为QTSS_ServiceID的值,指定即将被激活的服务。您可以调用QTSS_IDForAttr函数来获取您希望激活的服务的ID。
inArgs
输入参数,是一个类型为QTSS_ServiceFunctionArgsPtr的值,指向传递给服务的参数。
result
即为服务返回的结果码,如果inID不正当,则返回QTSS_IllegalService。
讨论
QTSS_DoService回调例程激活inID参数指定的服务。
为了给需要发送RTSP响应的模块提供便利,服务器提供了一些工具函数,用于正确地格式化RTSP响应,本部分将描述这些函数。RTSP报头回调函数如下:
QTSS_AppendRTSPHeader |
将信息附加到一个RTSP报头中。
QTSS_Error QTSS_AppendRTSPHeader(QTSS_RTSPRequestObject inRef,QTSS_RTSPHeader inHeader,const char* inValue,UInt32 inValueLen);
参数描述
inRef
输入参数,是一个类型为QTSS_RTSPRequestObject的值,表示一个RTSP流。
inHeader
输入参数,是一个类型为QTSS_RTSPHeader的值。
inValue
输入参数,是一个指向字节数组的指针,数组中包含即将被附加信息的报头。
inValueLen
输入参数,是一个类型为UInt32的值,包含inValue参数指向的正当数据的长度。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,则返回QTSS_BadArgument。
讨论
QTSS_AppendRTSPHeader回调例程将报头信息附加到RTSP报头中。在调用QTSS_AppendRTSPHeader函数之后,可以紧接着调用QTSS_SendRTSPHeaders函数来发送整个报头。
QTSS_SendRTSPHeaders |
发送一个RTSP报头。
QTSS_Error QTSS_SendRTSPHeaders(QTSS_RTSPRequestOjbect inRef);
参数描述
inRef
输入参数,是一个类型为QTSS_RTSPRequestObject的值,表示一个RTSP流。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,则返回QTSS_BadArgument。
讨论
QTSS_SendRTSPHeaders回调例程发送一个RTSP报头。当模块调用QTSS_SendRTSPHeaders函数的时候,服务器会使用请求的当前状态码发送一个正确的RTSP状态行。服务器还会发送正确的CSeq报头,会话ID报头,以及连接报头。
QTSS_SendStandardRTSPResponse |
向客户端发送一个RTSP响应。
QTSS_Error QTSS_SendStandardRTSPResponse(QTSS_RTSPRequestObject inRTSPRequest,
QTSS_Object inRTPInfo,UInt32 inFlags);
参数描述
inRTSPRequest
输入参数,是一个类型为QTSS_RTSPRequestObject的值,表示一个RTSP流。
inRTPInfo
输入参数,是一个类型为QTSS_Object的值。这里是指QTSS_ClientSessionObject或QTSS_RTPStreamObject对象,取决于要发送的响应。
inFlags
输入参数,是一个类型为UInt32的值。如果您希望服务器在RTP-Info报头中附加seq号,时间戳,以及SSRC信息,可将inFlags参数设置为qtssPlayRespWriteTrackInfo。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,则返回QTSS_BadArgument。
讨论
QTSS_SendStandardRTSPResponse回调例程将一个标准的响应写入到由inRTSPRequest参数指定的流。具体发送什么响应取决于不同的响应方法。
下面的枚举为inFlags参数定义了qtssPlayRespWriteTrackInfo常数:
enum
{
qtssPlayRespWriteTrackInfo = 0x00000001
};
这个函数支持下面这些响应方法:
QTSS模块可以产生和发送RTP数据包,以响应RTSP请求。典型情况下,RTP数据包在对客户端的SETUP请求的响应中发送。对于一个特定的会话,目前只有一个模块可以产生数据包。RTP回调例程如下:
QTSS_AddRTPStream |
使一个模块可以向客户端发送RTP数据包。
QTSS_Error QTSS_AddRTPStream(QTSS_ClientSessionObject inClientSession,QTSS_RTSPRequestObject inRTSPRequest,QTSS_RTPStreamObject* outStream,QTSS_AddStreamFlags inFlags);
参数描述
inClientRequest
输入参数,是一个类型为QTSS_ClientSessionObject的值,标识RTP数据包的发送功能即将被打开的客户会话。
inRTSPRequest
输入参数,是一个类型为QTSS_RTSPRequestObject的值。
outStream
输出参数,是一个指针,指向类型为QTSS_RTPStreamObject的值,该值含有新创建的流。
inFlags
输入参数,是一个类型为QTSS_AddStreamFlags的值,指定流的选项。
result
结果码。可能的返回值之一是QTSS_NoErr;如果QTSS_RTPStreamObject对象不能被创建,返回QTSS_RequestFailed;如果参数不正当,则返回QTSS_BadArgument。
讨论
QTSS_AddRTSPStream回调例程使一个模块可以向客户端发送RTP数据包,以响应RTSP请求。多次调用QTSS_AddRTSPStream函数可以向会话中加入多个流。
如果希望开始播放一个流,可以调用QTSS_Play函数。
QTSS_Play |
开始播放与客户会话相关联的流。
QTSS_Error QTSS_Play(QTSS_ClientSessionObject inClientSession,QTSS_RTSPRequestObject inRTSPRequest,QTSS_PlayFlags inPlayFlags);
参数描述
inClientSession
输入参数,是一个类型为QTSS_ClientSessionObject的值,标识一个客户会话,该会话的RTP数据包的发送功能已经在之前调用QTSS_AddRTPStream函数打开。
inRTSPRequest
输入参数,是一个类型为QTSS_RTSPRequestObject的值。
inPlayFlags
输入参数,是一个类型为QTSS_PlayFlags的值。将inPlayFlags参数设置为qtssPlaySendRTCP常数会使服务器在播放的过程中自动产生RTCP发送方报告。否则,模块会负责产生具体描述播放特征的发送方报告。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,返回QTSS_BadArgument;如果会话中没有加入流,则返回QTSS_RequestFailed。
讨论
QTSS_Play回调例程开始播放与指定客户会话相关联的流。
只有调用了QTSS_AddRTPStream函数的模块才能调用QTSS_Play函数。
在调用QTSS_Play函数之前,模块应该为当前这个RTP流设置下面这些QTSS_RTPStreamObject对象的属性:
在调用QTSS_Play函数之后,模块的RTP Send Packets角色就会被调用。
您可以调用QTSS_Pause函数来暂停流的播放,或者调用QTSS_Teardown来关闭客户会话。
QTSS_Pause |
暂停一个正在播放的流。
QTSS_Error QTSS_Pause(QTSS_ClientSessionObject inClientSession);
参数描述
inClientSession
输入参数,是一个类型为QTSS_ClientSessionObject的值,标识即将被暂停的客户会话。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,则返回QTSS_BadArgument。
讨论
QTSS_Pause回调例程暂停流的播放。只有调用了QTSS_AddRTPStream函数的模块才能调用QTSS_Pause函数。
QTSS_Teardown |
关闭一个客户会话。
QTSS_Error QTSS_Teardown(QTSS_ClientSessionObject inClientSession);
参数描述
inClientSession
输入参数,是一个类型为QTSS_ClientSessionObject的值,标识即将被关闭的客户会话。
result
结果码。可能的返回值之一是QTSS_NoErr;如果参数不正当,则返回QTSS_BadArgument。
讨论
QTSS_Teardown回调例程用于关闭一个客户会话。
只有调用了QTSS_AddRTPStream函数的模块才能调用QTSS_Teardown函数。
调用QTSS_Teardown会使上层模块的Client Session Closing角色被调用,调用时传入由inClientSession参数标识的客户会话。