首 页IT知识库翔宇问吧收藏本站
当前位置:翔宇亭IT乐园IT知识库编程技术C/C++

利用NetBIOS进行Windows网络编程

减小字体 增大字体 作者:佚名  来源:新浪网  发布时间:2011-03-16 16:35:38

然后为每个LANA编号分配NCB结构,并添加服务器名字,执行异步侦听。如果有客户机与服务器连接成功,则服务器接收由客户机发送的数据。程序代码如下:

// 为异步事件分配一组句柄
        EventArray = (HANDLE*)GlobalAlloc(GMEM_FIXED,sizeof(HANDLE) * lenum.length);
        // 为每个LANA编号分配一个NCB结构
        GlobalClients = (PNCB)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,sizeof(NCB) * lenum.length);
        // 产生事件,为LANA编号添加服务器名,并执行异步侦听
        for(i = 0; i < lenum.length; i++)
        {
                EventArray[i] = GlobalClients[i].ncb_event = CreateEvent(NULL, TRUE, FALSE, NULL);
                AddName(lenum.lana[i], SERVER_NAME, &num);
                Listen(&GlobalClients[i], lenum.lana[i], SERVER_NAME);
         }
        // 此时若在windows下运行Nbtstat–n 服务器名,会看到一个NetBIOS名字表。 
        // 产生事件,为LANA编号添加服务器名,并执行异步侦听
        while (1)
        {
                // 等待,直到有一个连接建立
                RetEvent = WaitForMultipleObjects(lenum.length, EventArray, FALSE, INFINITE);
                if (RetEvent == WAIT_FAILED)
                {
                        printf("等待连接失败!\n");
                        break;
                }
                // 遍历每个NCB结构,是否有多个连接建立,
                // 如果ncb_cmb_plt的值不是NRC_PENDING,即连接成功,
                // 则产生接收数据的是线程,并为它创建一个新的NCB结构。
                for(i = 0; i < lenum.length; i++)
                {
                        if (GlobalClients[i].ncb_cmd_cplt != NRC_PENDING)
                        {
                                pncb = (PNCB)GlobalAlloc(GMEM_FIXED, sizeof(NCB));
                                memcpy(pncb, &GlobalClients[i], sizeof(NCB));
                                pncb->ncb_event = 0;
                                hThread = CreateThread(NULL, 0, ClientThread,(LPVOID)pncb, 0, &ThreadId);
                                CloseHandle(hThread);
                                // 重设事件句柄,进行另一个侦听
                                ResetEvent(EventArray[i]);
                                Listen(&GlobalClients[i], lenum.lana[i], SERVER_NAME);
                        }
                }
        }

最后,关闭所有句柄,释放内存空间。

for(i = 0; i < lenum.length; i++)
        {
                DelName(lenum.lana[i], SERVER_NAME);
                CloseHandle(EventArray[i]);
        }
        GlobalFree(GlobalClients);

2、 异步事件客户机的实现

同实现服务器一样先进行初始化。在给LANA编号添加客户机名字之后,进行异步连接,若连接成功,则向服务器发送数据,最后,关闭句柄,释放内存空间。这里我只给出异步连接和发送数据的部分程序代码:

// 产生一个事件,并把它分配给一个相应的NCB结构,并执行异步连接
        for(i = 0; i < lenum.length; i++) 
        { 
                EventArray[i] = CreateEvent(NULL, TRUE, FALSE, NULL); 
                pncb[i].ncb_event = EventArray[i]; 
                AddName(lenum.lana[i], ClientName, &Num); 
                Connect(&pncb[i], lenum.lana[i], ServerName, ClientName); 
        }

// 等待,直到至少有一个连接成功 
        RetEvent = WaitForMultipleObjects(lenum.length, EventArray, FALSE, INFINITE); 
        if (RetEvent == WAIT_FAILED) 
        { 
                ErrorCode.Format("等待连接失败!"); 
                AfxMessageBox(ErrorCode); 
        } 
        else 
        { 
                // 如果有多个连接成功,关闭多余的连接,我们只用由 
                // WaitForMultipleObjects函数返回的连接;如果没有连接成功, 则取消。 
                for(i = 0; i < lenum.length; i++) 
                { 
                        if (i != RetEvent) 
                        { 
                                if (pncb[i].ncb_cmd_cplt == NRC_PENDING) 
                                        Cancel(&pncb[i]); 
                                else 
                                        Hangup(pncb[i].ncb_lana_num, pncb[i].ncb_lsn); 
                        } 
                } 
                // 发送消息 
                sprintf(SendBuffer, m_sendmsg); 
                RetValue = Send(pncb[RetEvent].ncb_lana_num, pncb[RetEvent].ncb_lsn, SendBuffer, strlen(SendBuffer)); 
                if (RetValue != NRC_GOODRET) 
                        AfxMessageBox("无法建立连接!"); 
                Hangup(pncb[RetEvent].ncb_lana_num, pncb[RetEvent].ncb_lsn); 
        }

上一页  [1] [2] 

知识评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 1分

内 容:

            请注意用语文明且合法,不要发布带有攻击性、侮辱性的言论,谢谢合作!

         通知管理员 验证码:

关于本站 | 网站帮助 | 广告合作 | 网站声明 | 友情连接 | 网站地图 | 用户守则 | 联系我们 |
本站大多数内容来自互联网或网站会员发布,如有侵权,请来信告之,谢谢!
Copyright © 2007-2017 biye5u.com. All Rights Reserved.
网站备案号:黑ICP备13005378号-3