- ·上一篇内容:Visual C++之WinSock编程介绍
- ·下一篇内容:学好VC++编程的十大秘诀
利用NetBIOS进行Windows网络编程
然后为每个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);
}