回 帖 发 新 帖 刷新版面

主题:WSAEnumProtocols()

关于WSAEnumProtocols()的用法,看了MSDN之后还不是很明白
比如我调用了这个函数:
WSAPROTOCOL_INFO *info=NULL;
    DWORD dwLen=0;
    int len=WSAEnumProtocols(NULL,info,&dwLen);
    if(len)
    {
        MessageBox("调用WSAEnumProtocols出错!");
    }
如果我想具体了解它所返回的WSAPROTOCOL_INFO结构体的信息,也就是我想
把当前所获得系统安装的网络协议的相关信息显示出来,应该怎么做呀?
我本想用info->szProtocol;来获得,可是在我单步跟踪的时候,却发现
它不走这一步,不知道为什么?
请各们知道的帮忙指点一下?

回复列表 (共6个回复)

沙发

我认为WSAEnumProtocols需要调用两次,第一次是取得dwLen的值,根据这个值为你的info动态分配内存(注意:分配后先将这块内存填0),然后再次调用WSAEnumProtocols把协议链的内容取出放到你的info中去

板凳

谢谢,我也知道是应该这样,可是当我具体做的时候,却不知道怎么来显示出系统的网络协议,在网上找了很长时间也没有找到个好的例子.
麻烦高手能不能写个例子说明一下.

3 楼

自己顶一下.

4 楼

写了个控制台程序:
#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 楼

谢谢,我回去调试一下!

6 楼

我这里也谢谢了!调试一下程序,不错!

不过,第一次调用的时候,既然只取dwLen的值,第二个参数只设为NULL就行了吧:
WSAEnumProtocols(NULL, NULL, &dwLen)

我来回复

您尚未登录,请登录后再回复。点此登录或注册