第7章 Winsock 服务提供者接口 (SPI)

本章的两个例子源码 :

(1)、LSP   (2)、InstDemo

例子本身没问题,但是在安装了 LSP.dll 之后,貌似网络断了。搞了半天,居然是 DLL 路径的问题,出现全部网络连接都不通的原因是找不到安装的 DLL。

 

最安全的安装方式是 :

   1)、比如,LSP.dll 和 InstDemo.exe 位于 C:\LSP ,则将 CMD 也设置到 路径 C:\LSP 。

   2)、InstDemo --> InstallProvider 传入 DLL的完整路径 。

 

如果,还是有不能访问网络的现象发生,就查看下DLL所在的路径,看看是不是装对了...

///
// WSCEnumProtocols.cpp文件


#include <Ws2spi.h>		//  SPI函数定义在Ws2spi.h文件中
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32")	// 链接到WS2_32.lib

LPWSAPROTOCOL_INFOW GetProvider(LPINT lpnTotalProtocols)
{
	int nError;
	DWORD dwSize = 0;
	LPWSAPROTOCOL_INFOW pProtoInfo = NULL;
	
	//  取得需要的缓冲区长度
	if(::WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError) == SOCKET_ERROR)
	{
		if(nError != WSAENOBUFS)
			return NULL;
	}
	// 申请缓冲区,再次调用WSCEnumProtocols函数
	pProtoInfo = (LPWSAPROTOCOL_INFOW)::GlobalAlloc(GPTR, dwSize);
	*lpnTotalProtocols = ::WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError);
	return pProtoInfo;
}

void FreeProvider(LPWSAPROTOCOL_INFOW pProtoInfo)
{
	::GlobalFree(pProtoInfo);
}

void main()
{
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2, 2);
	if(::WSAStartup(sockVersion, &wsaData) != 0)
	{
		printf("WSAStartup failed : %d\n", ::GetLastError());
		return;
	}
	
	LPWSAPROTOCOL_INFOW pProtoInfo;
	int nProtocols;
	pProtoInfo = GetProvider(&nProtocols);

	for(int i=0; i<nProtocols; i++)
	{
		printf("==> %d) : \n", i);
		printf("      Protocol: %ws \n", pProtoInfo[i].szProtocol);
		printf("      CatalogEntryId: %d		ChainLen: %d \n", 
			pProtoInfo[i].dwCatalogEntryId, pProtoInfo[i].ProtocolChain.ChainLen);

		int nError;
		WCHAR szBaseProviderDll[MAX_PATH] = {0};
		int nLen = MAX_PATH;
		if (SOCKET_ERROR == ::WSCGetProviderPath(&pProtoInfo[i].ProviderId, &szBaseProviderDll[0], &nLen, &nError))
		{
			printf("      WSCGetProviderPath(%d) failed %d \n", i, nError);
		}
		else
		{
			if (! ::ExpandEnvironmentStringsW(szBaseProviderDll, szBaseProviderDll, MAX_PATH))
				{printf("      ExpandEnvironmentStringsW(%d) failed %d \n", i, ::GetLastError());}
			else
				{printf("      %ws\n\n", szBaseProviderDll);}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值