Итак...
Код:
invoke WSAAsyncSelect, hSocket2, hWnd,WM_SOCKET, FD_ACCEPT+FD_READ
А
FD_CLOSE кто будет обрабатывать?
Вот где сама проблема:
Код:
FD_ACCEPT:...
invoke accept,hSocket2,0,0
mov hClient,eax
Не хватает после этого добавить:
Код:
invoke WSAAsyncSelect, eax, hWnd,WM_SOCKET, FD_ACCEPT+FD_READ+FD_CLOSE
для обработки событий от клиентского сокета.
Ещё здесь исправить:
Код:
FD_READ:...
invoke recv, hClient, addr BytRecu, 1024,0
.....
invoke lstrlen, addr BytRecu
.....
Зачем получать количество полученных байт через lstrlen, если после вызова функции recv, количество полученных байт будет в eax? Но это не главное... Проблема в дескрипторе сокета, из которого ты пытаешься читать. Надо читать не из hClient, т.к. дескриптор сокета хранится в
wParam (передаётся с сообщением WM_SOCKET).
Вот так правильно:
Код:
invoke recv, wParam, addr BytRecu, 1024,0
С FD_CLOSE тоже самое... Надо так:
Код:
invoke closesocket, wParam
P.S. Тебе надо ещё доделать сам чат.

P.P.S.
Полезная ссылка по теме