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;
}