|
#1
|
|||
|
|||
UdpSocket
Хочу сделать что то на подобии чата с использованием компонента UdpSocket... Помогите... Нужен самый простой, и примитивный пример с использованием именного этого компонента!!! Заранее благодарен!
|
#2
|
||||
|
||||
Обычно я использую поиск. Вот нашел такой ответик:
Цитата:
А вот оттуда-же пример: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Winsock, StdCtrls; const HST_BROADCAST: String = '255.255.255.255'; MAX_UDP_SIZE: Integer = 8192; WM_ASYNC = WM_USER + 1; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); public FHandle: HWND; procedure SockWND(var AMsg: TMessage); message WM_ASYNC; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var FWSAData: TWSAData; FSockAddr: TSockAddrIn; FSocket: HWND; Option: Boolean; Data: String; begin WSAStartup($0101, FWSAData); FSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); with FSockAddr do begin sin_addr.S_addr := INADDR_BROADCAST; Option := True; SetSockOpt(FSocket, SOL_SOCKET, SO_BROADCAST, PChar(@Option), SizeOf(Option)); sin_port := htons(6767); sin_family := AF_INET; end; Data := 'My first broadcast message!!!'; SendTo(FSocket, Data[1], Length(Data), 0, FSockAddr, SizeOf(FSockAddr)); closesocket(FSocket); WSACleanup; end; procedure TForm1.SockWND(var AMsg: TMessage); var Buffer: array [0..8191] of Char; Size: Integer; SockAddr: TSockAddrIn; begin with AMsg do case Msg of WM_ASYNC: begin case WSAGetSelectEvent(LParam) of FD_READ: begin FillChar(Buffer, 8192, #0); Size := SizeOf(SockAddr); recvfrom(WParam, Buffer[0], MAX_UDP_SIZE, 0, SockAddr, Size); ShowMessage(StrPas(@Buffer)); DeallocateHWnd(FHandle); closesocket(WParam); WSACleanup; end; end; end else DefWindowProc(FHandle, Msg, WParam, LParam); end; end; procedure TForm1.Button2Click(Sender: TObject); var FWSAData: TWSAData; FSockAddr: TSockAddrIn; FSocket: HWND; Option: Boolean; Data, SrvHost: String; begin WSAStartup($0101, FWSAData); FSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); with FSockAddr do begin SrvHost := '192.168.2.108'; // Это IP сервака (т.е. нашей машины) sin_addr.S_addr := inet_addr(PChar(SrvHost));; Option := True; SetSockOpt(FSocket, SOL_SOCKET, SO_BROADCAST, PChar(@Option), SizeOf(Option)); sin_port := htons(6767); sin_family := AF_INET; end; bind(FSocket, FSockAddr, SizeOf(FSockAddr)); FHandle := AllocateHWnd(SockWND); WSAAsyncSelect(FSocket, FHandle, WM_ASYNC, FD_READ); end; end. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 24.09.2010 в 21:07. |
#3
|
|||
|
|||
Цитата:
|
#4
|
|||
|
|||
TUdpSocket насколько знаю немного косой. Он может только отправлять. Когда самому надо было делать программу на udp, писал все на winсокетах.
|