主题:WSAEnumProtocols()
vbcs
[专家分:3910] 发布于 2006-08-29 14:37:00
关于WSAEnumProtocols()的用法,看了MSDN之后还不是很明白
比如我调用了这个函数:
WSAPROTOCOL_INFO *info=NULL;
DWORD dwLen=0;
int len=WSAEnumProtocols(NULL,info,&dwLen);
if(len)
{
MessageBox("调用WSAEnumProtocols出错!");
}
如果我想具体了解它所返回的WSAPROTOCOL_INFO结构体的信息,也就是我想
把当前所获得系统安装的网络协议的相关信息显示出来,应该怎么做呀?
我本想用info->szProtocol;来获得,可是在我单步跟踪的时候,却发现
它不走这一步,不知道为什么?
请各们知道的帮忙指点一下?
回复列表 (共6个回复)
沙发
xin5439 [专家分:570] 发布于 2006-08-30 13:42:00
我认为WSAEnumProtocols需要调用两次,第一次是取得dwLen的值,根据这个值为你的info动态分配内存(注意:分配后先将这块内存填0),然后再次调用WSAEnumProtocols把协议链的内容取出放到你的info中去
板凳
vbcs [专家分:3910] 发布于 2006-08-30 15:23:00
谢谢,我也知道是应该这样,可是当我具体做的时候,却不知道怎么来显示出系统的网络协议,在网上找了很长时间也没有找到个好的例子.
麻烦高手能不能写个例子说明一下.
3 楼
vbcs [专家分:3910] 发布于 2006-08-31 12:53:00
自己顶一下.
4 楼
xin5439 [专家分:570] 发布于 2006-09-02 11:10:00
写了个控制台程序:
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
void main(void)
{
WSADATA wsaData;
WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
LPWSAPROTOCOL_INFO info = NULL;
DWORD dwLen;
//因为info还未分配内存,第一次调用必定会失败,但能够得到dwLen的值
if (SOCKET_ERROR == WSAEnumProtocols(NULL, info, &dwLen))
{
int iErrorCode = GetLastError();
if (WSAENOBUFS != iErrorCode)
{
WSACleanup();
return;
}
}
if (dwLen > 0)
{
info = (LPWSAPROTOCOL_INFO)GlobalAlloc(GPTR, dwLen);
if (info == NULL)
{
printf("Allocate memory failed! ErrorCode is %d", GetLastError());
WSACleanup();
return;
}
//第二次调用
int iProtocolCounts = WSAEnumProtocols(NULL, info, &dwLen);
if (SOCKET_ERROR == iProtocolCounts)
{
printf("WSCEnumProtocols Error: %d", GetLastError());
GlobalFree(info);
WSACleanup();
return;
}
//打印本机安装的协议信息
for (int i=0; i<iProtocolCounts; i++)
{
printf("\ni=%d\nProtocolDescription:%s\n", i, info[i].szProtocol);
}
GlobalFree(info);
}
WSACleanup();
}
5 楼
vbcs [专家分:3910] 发布于 2006-09-03 16:42:00
谢谢,我回去调试一下!
6 楼
yousuosi [专家分:0] 发布于 2008-04-18 17:58:00
我这里也谢谢了!调试一下程序,不错!
不过,第一次调用的时候,既然只取dwLen的值,第二个参数只设为NULL就行了吧:
WSAEnumProtocols(NULL, NULL, &dwLen)
我来回复