接上篇啦O(∩_∩)O哈哈~
前几步和事件模型一样,不再详述。
(1)枚举本机所有可用LANA
(2)重设每个LANA
(3)增加进程名字到每个LANA的名字表中
(4)在每个LANA进行监听客户连接。这一步和事件模型里不同
//回调函数。在监听到客户连接后,系统将调用此函数
void CALLBACK ListenCallback(PNCB pncb)
{
HANDLE hThread;
DWORD dwThreadId;
if (pncb->ncb_retcode != NRC_GOODRET)
{
printf("ERROR: ListenCallback: %d/n", pncb->ncb_retcode);
return;
}
Listen(pncb->ncb_lana_num, SERVER_NAME);
hThread = CreateThread(NULL, 0, ClientThread, (PVOID)pncb, 0,
&dwThreadId);
if (hThread == NULL)
{
printf("ERROR: CreateThread: %d/n", GetLastError());
return;
}
CloseHandle(hThread);
return;
}
//监听函数
int Listen(int lana, char *name)
{
PNCB pncb = NULL;
pncb = (PNCB)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizeof(NCB));
pncb->ncb_command = NCBLISTEN | ASYNCH;
pncb->ncb_lana_num = lana;
pncb->ncb_post = ListenCallback;//回调函数,异步监听完成即客户连接后,系统将调用此函数。
//
// This is the name clients will connect to
//
memset(pncb->ncb_name, ' ', NCBNAMSZ);
strncpy(pncb->ncb_name, name, strlen(name));
//
// An '*' means we'll take a client connection from anyone. By
// specifying an actual name here you restrict connections to
// clients with that name only.
//
memset(pncb->ncb_callname, ' ', NCBNAMSZ);
pncb->ncb_callname[0] = '*';
if (Netbios(pncb) != NRC_GOODRET)
{
printf("ERROR: Netbios: NCBLISTEN: %d/n", pncb->ncb_retcode);
return pncb->ncb_retcode;
}
return NRC_GOODRET;
}
//下边两步和事件模型一样
(5)等待客户连接
(6)线程函数
完。