У меня только один LANA и связь клиент сервер я тестирую сейчас на одном компьютере.Потом протестирую в сети. Данный подход позволил мне всё упростить.
Сначала нам необходимо подготовить буфер в переменной NCB ncb_event. GlobalAlloc выделяет память. CreateEvent создает объект сообщения.
NCB ncb; HANDLE *events; events = (HANDLE *)GlobalAlloc(GMEM_FIXED, sizeof(HANDLE) lenum.length); ClearStruct(&ncb); events[0] = CreateEvent(NULL, TRUE, FALSE, NULL); ncb.ncb_event = events;
В процедуры я добавил изменения смотрите проект.
Первым шагом необходимо проинициализировать LANA - это мы делали и знакомо
if (ResetNetBios(LANA_NUM)!=NRC_GOODRET) printf("Error Reset \n"); else printf("God Reset\n");
Добавить имя это тоже нам знакомо:
if (AddNetBiosName(LANA_NUM,CLIENT_NAME)!=NRC_GOODRET) printf("Error Add \n"); else printf("God Add Name\n");
А вот теперь функция Connect():
void Connect(PNCB pncb) { int dwRetCode; // в поле ncb_name имя клиента FillMemory(pncb->ncb_name, sizeof(pncb->ncb_name), ' '); CopyMemory(pncb->ncb_name, CLIENT_NAME, strlen(CLIENT_NAME)); // в поле ncb_callname имя сервера FillMemory(pncb->ncb_callname, sizeof(pncb->ncb_callname), ' '); CopyMemory(pncb->ncb_callname, SERVER_NAME, strlen(SERVER_NAME)); // команда вызова pncb->ncb_command = NCBCALL | ASYNCH; dwRetCode = Netbios(pncb); if (pncb->ncb_retcode != NRC_PENDING) printf("Error Connect\n"); return; }
И наконец ожидание ответа:
while (!done) { conn = WaitForMultipleObjects(lenum.length, events, FALSE, INFINITE); if (ncb.ncb_retcode == NRC_GOODRET) { printf("CONNECTED! \n"); done = TRUE; } }
Для тестирования клиента необходим сервер(программа). Она то у меня работает (в следующем шаге создадим) и поэтому этот шаг протестирован. Сразу хочу предупредить, что если у Вас LANA больше чем 1 и он не равен 0, то могут быть ошибки. Смотрите определения моих макроподстановок:
#define CLIENT_NAME "myclient" #define SERVER_NAME "myserver" #define MAX_SESSION 50 #define MAX_NAMES 50 #define LANA_NUM 000