WSResolveLinkService (C 函数)
int WSResolveLinkService(WSENV e, WSResolveCallbackFunction f, const char *p, const char *n, void *c, WSServiceRef *r)
开始询问网络,为名为 n 的链接服务解析连接详情(connection details),该链接服务为协议 p 的服务,异步通过回调函数 f 向应用通知连接详情,向 f 传递上下文对象 c 和解析操作基准(resolve operation reference)r.
更多信息
- 对于一个使用 WSTP 链接服务的应用而言,这个应用必须做两件事:1) 应用必须浏览可用服务;以及 2) 应用必须解析其在浏览操作过程中发现的服务名称,来为连接到链接服务获取链接的连接详情.
- WSTP 库会发送回调函数 f、服务名称 n、链接的名称、链接协议和调用那些 WSOpen 函数之一来创建一个到服务 n 的链接所需的连接选项.
- 对连接详情解析其服务名称本质上是一个异步操作. WSResolveLinkService() 开始这个解析操作,并迅速返回. 当连接详情可用时,WSTP 库会用这些连接详情向应用作出回调操作.
- 由于 WSTP 库异步提供连接详情,回调函数 f 必须注意保护共享资源的访问,例如可以从另一线程同步访问的数据结构.
- 上下文对象 c 是应用需要成功解析一个链接服务所需的任意对象的指针.
- 使用 WSStopResolvingLinkService() 来停止解析操作.
- 若函数成功,则 WSResolveLinkService() 返回0,若函数失败,则返回非零值.
- 从 WSResolveLinkService() 返回的、作为发生错误的结果的非零值相当于 wstp.h 中的 WSE 错误代码,并由 WSError() 返回.
范例
基本范例 (1)
#include <string.h> /* for memset, memcpy, etc... */
#include <stdio.h> /* for snprintf */
#include "wstp.h"
void ResolveCallbackFunction(WSENV e, WSServiceRef r, const char *serviceName, const char *linkName, const char *protocol, int options, void *context);
WSServiceRef startResolvingServiceWithNameAndProtocol(WSENV e,
const char *name, const char *protocol)
{
WSServiceRef theRef;
int apiResult = 0;
apiResult = WSResolveLinkService(e, ResolveCallbackFunction,
protocol, name, NULL /* No context object for this example */,
&theRef);
if(apiResult != 0)
{ /* Handle the error */ }
return theRef;
}
void ResolveCallbackFunction(WSENV e, WSServiceRef r, const char *serviceName, const char *linkName, const char *protocol, int options, void *context)
{
WSLINK newLink = (WSLINK)0;
int error = 0;
int argc = 0;
const char *argv[] = {
"Dummy value representing program name",
"-linkname",
(const char *)0,
"-linkprotocol",
(const char *)0,
"-linkconnect",
"-linkoptions",
(const char *)0,
/* The following NULL pointer terminates the argv array */
(const char *)0
};
char optionsBuffer[50];
memset((void *)optionsBuffer, 0, sizeof(char) * 50));
snprintf(optionsBuffer, 50, "%d", options);
argv[2] = linkName;
argv[4] = protocol;
argv[7] = (const char *)optionsBuffer;
argc = 8;
newLink = WSOpenArgcArgv(e, argc, argv, &error);
if(newLink == (WSLINK)0 || error != WSEOK)
{ /* Handle the error */ }
/* ... */
return;
}