![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WinSock сервер, события [D6, WinXP]
Delpher_Gray © (2004-02-27 06:43:00)Как сделать, чтоб программа воспринемала сообщения от сокета ?
Вот код небольшой программки:
...
var
Form1: TForm1;
Data: WSAData;
Sock: TSocket;
Addr: TSockAddr;
Msg: integer;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
if WSAStartup($101, Data) <> 0 then
Die;
Sock := Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if Sock = INVALID_SOCKET then
Die;
WSAAsyncSelect(Sock, Form1.Handle, Msg, FD_READ or FD_WRITE or FD_CLOSE);
Addr.sin_family := AF_INET;
Addr.sin_addr.S_addr := INADDR_ANY;
Addr.sin_port := htons(1379);
Bind(Sock, Addr, SizeOf(Addr));
Listen(Sock, SOMAXCONN);
end;
Сокет прослушивает порт, подскажите как сделать чтоб можно было обрабатывать события сокета: соединение, рассоединение, чтение данных и прочее...
Заранее благодарен !
Digitman (2004-02-27 09:19:00) [41]угу ... а то "из пушки по воробьям" получается - VCL все равно используется, размер модуля Forms будет определяющим в размере готового исп.файла, и попытки "сэкономить" на программиновании трансп.подсистемы непосредственно на WSAPI (если даже чем-то оправданы) выглядят в данном контексте по меньшей мере смешными
Rouse_ (2004-02-27 09:04:00) [42]К примеру Msg у тебя обявлена как WM_ASYNC = WM_USER + 1;
тогда делай процедуру
procedure SockWND(var AMsg: TMessage); message WM_ASYNC;
в которой обрабатывай
WSAGetSelectEvent(Amsg.LParam) который равен FD_READ
в нем и читай...
А вообщето действительно лучше TClient/ServerSocket
Digitman (2004-02-27 08:14:00) [43]для начала скажи, это что, учебная задача ?
почему не используешь стандартные TClient/ServerSocket ?
Delpher_Gray (2004-01-23 13:21:00) [44]Не понял :))
В модуле Classes обработка сообщений сделана так:
SetWindowLong(Wnd, GWL_WNDPROC, ???);
Вместо ??? идёт процедура, которая будет вызываться, но как всё это написать !?
SetWindowLong(Wnd, GWL_WNDPROC, Serv.SockWND); - ошибка
Где Serv - TServer;