本章的两个例子源码 :
(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);}
}
}
}