Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Блокирующиеся сокеты [D6, WinXP]


Delpher_Gray ©   (2004-04-01 15:08:00) 

Приведите пожалуйста простейший пример работы с блокирующимися сокетами.

Заранее благодарен !


Rouse_   (2004-04-03 11:39:00) [1]

В качестве материала для изучения посмотри следующие ресурсы:

http://book.itep.ru/7/sock_71.htm
http://gem.dpt.ustu.ru/InterNetBook/Contents.htm

Желаю успехов


Kvic   (2004-04-03 09:23:00) [2]

А где бы почитать про все это ?


Digitman   (2004-04-02 11:37:00) [3]


> Ну вообще легче же работать с блокирующимися сокетам


ну что значит "легче" ? да, с т.з. программной реализации транспорта в блок.режиме, это на первый взгляд проще ... но ! .. это вроде бы проще на кл.стороне, зато на серверной стороне, если ты выбираешь из-за "простоты" блокирующий режим, тебе придется задействовать threadblocking-режим работы ServerSocket'а, что повлечет за собой реализацию и задействование доп.код.потоков

вообще же каждый режим имеет свои преимущества и недостатки, и говорить вот так вот необдуманно насчет "проще" или "сложнее" не следует ... вская палка - о двух концах)


> У меня не вышло :( Когда нажму 10 раз в секунду нопку отправить,
> тогда принемающий получает искажённые данные ! А почему
> !?!


а потому, что ты не представляешь себе особенности работы гнездового транспорта в неблок.режиме ... не представляешь себе четко, какие события, в какой последовательности и по каким конкретно произошедшим фактам возбуждаются компонентами ... так же, видимо, не представляешь себе ощутимые различия в логике вызова/исполнения методов Open, Send, Receive вс случаях, когда они вызываются в блок. и неблок. режимах .. здесть просто нужно сесть и детально разобраться в том , что и как происходит в том или ином режиме ... и только после этого делать обоснованные умозаключения, что "проще" а что "сложнее" ...


Delpher_Gray   (2004-04-02 11:19:00) [4]

Ну вообще легче же работать с блокирующимися сокетамИ, когда проходит много данных от нескольких пользователей, или можно это без глюков реализовать с неблок. сокетами !? У меня не вышло :( Когда нажму 10 раз в секунду нопку отправить, тогда принемающий получает искажённые данные ! А почему !?!


Digitman   (2004-04-02 08:24:00) [5]


> у серверу будет много подключений, и нужно юзать блокирующиеся
> сокеты


я не вижу никакой связи между кол-вом подключений и режимом работы гнезд ... поясни свою логику


> как передатьва от клиента к северу и наоборот record


в блокирующем режиме оч.просто

type
TMyRecord = packed record
 //поля простыхтипов данных
end;

var
 MyRecord: TMyRecord;

... передаем
Socket.SendBuf(MyRecord, SizeOf(MyRecord));

... принимаем
Socket.ReceiveBuf(MyRecord, SizeOf(MyRecord));


Delpher_Gray   (2004-04-01 18:05:00) [6]

Проблема в том, что я совсем не знаю как этого делать !
Подскажи на конкретном примере.


Digitman   (2004-04-01 16:35:00) [7]


> нужно юзать блокирующиеся сокеты


не таких.

есть "гнезда, инициализируемые для работы в блокирующемрежиме"


> как передатьва от клиента к северу и наоборот record


в чем проблема ? конкретно ?


Delpher_Gray   (2004-04-01 15:39:00) [8]

2Verg:
Мне не нужен WinSock !
Мне пример нужен с TServerSocket и TClientSocket !

У меня у серверу будет много подключений, и нужно юзать блокирующиеся сокеты а как я незнаю :(

Подскажите например как передатьва от клиента к северу и наоборот record?


Verg   (2004-04-01 15:30:00) [9]

Да тут было уже это совсем недавно.
Проще не бывает:


program Client;
{$APPTYPE CONSOLE}

uses
 Windows,
 WinSock;

var A : TSockAddrIn;
   S : TSocket;
   WSAData : TWSAData;
   Ret : integer;
   Buffer : array[0..255] of char;
   Ostr : string;
   RecvSize : DWORD;

function SysErrorMessage(ErrorCode: Integer): string;
var
 Len: Integer;
 Buffer: array[0..255] of Char;
begin
 Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or
   FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer,
   SizeOf(Buffer), nil);
 while (Len > 0) and (Buffer[Len - 1] in [ #0..#32, '.']) do Dec(Len);
 SetString(Result, Buffer, Len);
end;

function ToOem(const S : string):string;
begin
 Result := S;
 if S<>'' then
   CharToOemBuff(pchar(Result), pchar(Result), length(Result));
end;

procedure PrintErr(Err : DWORD);
begin
 Writeln(ToOem(SysErrorMessage(Err)));
end;

function checksocket(Ret : integer):boolean;
begin
 Result := Ret = SOCKET_ERROR;
 if Result then
 begin
   PrintErr(WSAGetLastError);
   Readln;
 end;
end;

begin
 Ret := WSAStartup(MAKEWORD(1,1), WSAData);
 if  Ret = NO_ERROR then
 try
   S := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
   if S = INVALID_SOCKET then
   begin
     PrintErr(WSAGetLastError);
     readln;
     exit;
   end;
   try
     FillChar(A, sizeof(A), 0);
     A.sin_family := AF_INET;
     A.sin_port   := htons( 80 );
     A.sin_addr.S_addr := inet_addr('194.67.57.50');
     if checksocket(connect(S, A, sizeof(A))) then
       exit;
     Ostr := 'GET / HTTP/1.0'#13#10#13#10;
     if checksocket(send(S, Ostr[1], length(Ostr), 0)) then
       exit;
     RecvSize := 0;
     repeat
       Ret := recv(S, Buffer, sizeof(buffer), 0);
       if checksocket(Ret) then
           exit;
       if Ret = 0 then
       begin
         Writeln;
         WriteLn('------- Disconnected bytes received---:', RecvSize);
         readln;
         exit;
       end;
       Inc(RecvSize, Ret);
       SetString(Ostr, Buffer, Ret);
       Write(ToOem(OStr));
     until false;
   finally
     closesocket(S);
   end;
 finally
   WSACleanup;
 end else
 begin
   PrintErr(Ret);
   readln;
 end;
end.


Digitman   (2004-04-01 15:29:00) [10]

cs := TClientSocket.Create(nil);
cs.ClientType := ctBlocking;
cs.Host := 'Delpher_Gray';
cs.Service := 'SomeDelpherGraysService';
cs.Open;


Наверх

Титульная страница Поиск, карта сайта Написать письмо