程式中的使用方法分别为:
char serv_name[20];
char proto;
struct servent far *svptr;
/* 假设 serv_name 及 proto 已先设好服务名称及通讯协定 */
svptr = (struct servent FAR *)getservbyname( (char far *)serv_name, (c har far
*)proto )
int serv_port;
char proto;
struct servent far *svptr;
/* 假设 serv_port 及 proto 已先设好服务所用的 port number 及通讯协定 * /
svptr = (struct servent FAR *)getservbyport( htons(serv_port), (char f ar*)proto) )
Winsock 环境下,我们能够查询到的服务资料都是存放在 local 的「services」档中;这个档所存放的都是 well-known 的服务,基本上我们是不需去更改它的。读者也可以将自己提供的服务加到这个档中,不过您所用的服务资料要公诸於世,不然别人的services 档中可是没有您的服务的资料哟。
最後的这组 getprotobyname() 及 getprotobynumber() 函式是用来取得一些 「协定」的资料,比如 tcp、udp、igmp 等。一般而言,我们是不太会用到的。
◎ getprotobyname():依照通讯协定(protocol) 的名称来获取该通讯协定的其他资料。
格式: struct protoent FAR * PASCAL FAR getprotobyname(const char FAR *name );
参数: name 通讯协定名称
传回值: 成功 - 一指向 protoent 结构的指标
失败 - NULL (呼叫 WSAGetLastError() 可得知原因)
说明: 利用通讯协定的名称来得知该通讯协定的别名、编号等资料。
◎ getprotobynumber():依照通讯协定的编号来获取该通讯协定的其他资料。
格式: struct protoent FAR * PASCAL FAR getprotobynumber( int number );
参 数: number 以 host order 排列方式的通讯协定编号
传回值: 成功 - 一指向 protoent 结构的指标
失败 - NULL (呼叫 WSAGetLastError() 可得知原因)
说明: 利用通讯协定的编号来得知该通讯协定的名称、别名等资料。
程式中呼叫方式分别如下:
struct protoent far *ptptr;
char proto_name[20];
/* 假设 proto_name 已先设好协定名称 */
ptptr = (struct protoent FAR *)getprotobyname( (char far *)proto_name)
struct protoent far *ptptr;
int proto_num;
/* 假设 proto_num 已先设好协定编号 */
ptptr = (struct protoent FAR *)getprotobynumber( proto_num )
Winsock Stack 对於应用程式呼叫 getprotobyname() 及 getprotobynumber() 的资料,是取自於local 的「protocol」档;如无需要,我们也不用去变更这个档案的内容。
(图 2)hello 程式呼叫同步资料库函式
【非同步资料库函式】
Winsock 1.1 针对前面笔者所描述的 6 个同步资料库函式,也提供了相对的 6 个非同步资料库函式,它们分别是 WSAAsyncGetHostByName()、 WSAAsyncGetHostByAddr()、WSAAsyncGetServByName()、WSAAsyncGetServByPort()、WSAAsyncGetProtoByName()、WSAAsyncGetProtoByNumber()。
由於它们取得的资料与同步资料库函式相同,所以笔者仅以WSAAsyncGetHostByName() 为例,说明这些非同步函式,并告诉各位读者,同步和非同步资料库函式不同的地方。
由字面来看,「非同步」的意思就是我们发出问题时,并不会马上得到答覆,而等到系统取到资料时再告知我们