![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сокеты без окон
Aven © (2006-03-02 22:55:00)Как можно использовать сокеты без создания окна? т.е. нужно принимать события сокетов в консольной проге.. а создавать окно очень не хочется.Знаю это возможно, но мож кто-то знает как?
злыдень (2006-03-08 17:30:00) [1]<offtop>
XProger © (03.03.06 17:52) [8]
ты в RFC по IRC-протоколу + в доки по mIRC заглядывать не пробовал? #31 не ХЗ, а Underline =) и еще много спорных моментов :)
</offtop>
umbra (2006-03-06 10:20:00) [2]если окна недопустимы, то используйте блокирующие сокеты - Indy. Помещайте компоненты в DataModule (это не окно) и делайте все, что Вам нужно.
Сергей М. (2006-03-06 08:12:00) [3]
> не каких окон там не должно быть по причине запуска оной
> через wine под linux в консоли
С каких пор wine перестал эмулировать оконные ф-ции win32 ?
Delphi_is_cool (2006-03-04 12:11:00) [4]Кусочек кода из одной моей программы:
program Project2;
{$APPTYPE CONSOLE}
uses
Windows, WinSock, SysUtils;
function WaitForRead(Socket: TSocket; const Timeout: Word = 500) : Boolean;
var
TV: TTimeVal;
FSet: TFDSet;
begin
ZeroMemory(@FSet, SizeOf(TFDSet));
FD_SET(Socket, FSet);
TV.tv_sec := 0;
TV.tv_usec := Timeout;
Result := Select(0, @FSet, nil, nil, @TV) = 1;
end;
function RecvLength(Socket: TSocket) : LongInt;
begin
IoCtlSocket(Socket, FIONREAD, Result);
end;
procedure ThreadProc(Socket: TSocket); stdcall;
begin
while True do
if WaitForRead(Socket) then
if RecvLength(Socket) = 0 then
CloseSocket(Socket) // Клиент отключился
else begin
// Пришли какието данные
end;
end;
function CreateServer : TSocket;
var
addr: sockaddr_in;
ServerReady: Boolean;
begin
Result := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if Result <> INVALID_SOCKET then
begin
ZeroMemory(@addr, SizeOf(sockaddr_in));
with addr do
begin
sin_family := AF_INET;
sin_port := htons(12345);
sin_addr.S_addr := INADDR_ANY;
end;
ServerReady := (Bind(Result, addr, SizeOf(sockaddr_in)) <> SOCKET_ERROR) and (Listen(Result, SOMAXCONN) <> SOCKET_ERROR);
if not ServerReady then
begin
CloseSocket(Result);
Result := INVALID_SOCKET;
end;
end;
end;
var
C: Cardinal;
WSAData: TWSAData;
ServerSocket: TSocket;
begin
if WSAStartup($0101, WSAData) = 0 then
begin
ServerSocket := CreateServer;
if ServerSocket <> INVALID_SOCKET then
begin
while True do
CloseHandle(CreateThread(nil, 0, @ThreadProc, Pointer(Accept(ServerSocket, nil, nil)), 0, C));
CloseSocket(ServerSocket);
end;
WSACleanup;
end;
end.
Надёсь поможет :)
Aven (2006-03-03 23:15:00) [5]umbra из консоли запустится только консольное :) Если создается окно, то ошибка :) Из графич. оболочки, запишется.
XProger пасиб, прикольный сайт, много интересного нашел... вот только там TCP клиент, а не сервер... :(
XProger (2006-03-03 17:52:00) [6]http://xproger.mirgames.ru/?id=2&page=1#XiRC
Консольное приложение, работа с TCP сокетом реализована в отдельном потоке.
umbra (2006-03-03 17:16:00) [7]а разве wine не поддерживает окон?
Aven (2006-03-03 16:43:00) [8]Сергей М. программа консольная, не каких окон там не должно быть по причине запуска оной через wine под linux в консоли.
Slym что-то я сомневаюсь что это без окон....
Slym (2006-03-03 14:53:00) [9]TServerSocket + ThreadBlocking
Сергей М. (2006-03-03 11:01:00) [10]
> создавать окно очень не хочется
В смысле лень создавать его "ручками" ? Или по каким-то другим причинам ?
ZzzzZ (2006-03-03 07:13:00) [11]Эвенты юзай, хорошаю штука, простая.
Иди на мсдн, там все прояснится.
Aven (2006-03-03 01:28:00) [12]А кусок кода можно? По хелпу ничего не понял :(
Rouse_ (2006-03-03 00:40:00) [13]select