Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Блокирующиеся сокеты   Найти похожие ветки 

 
Delpher_Gray ©   (2004-04-01 15:08) [0]

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

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


 
Digitman ©   (2004-04-01 15:29) [1]

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


 
Verg ©   (2004-04-01 15:30) [2]

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


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.


 
Delpher_Gray ©   (2004-04-01 15:39) [3]

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

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

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


 
Digitman ©   (2004-04-01 16:35) [4]


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


не таких.

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


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


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


 
Delpher_Gray ©   (2004-04-01 18:05) [5]

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


 
Digitman ©   (2004-04-02 08:24) [6]


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


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


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


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

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

var
 MyRecord: TMyRecord;

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

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


 
Delpher_Gray ©   (2004-04-02 11:19) [7]

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


 
Digitman ©   (2004-04-02 11:37) [8]


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


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

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


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


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


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

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


 
Rouse_ ©   (2004-04-03 11:39) [10]

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.025 c
4-1080457228
Navi
2004-03-28 11:00
2004.05.23
Извлечь иконку по расширению


3-1082539137
Sirus
2004-04-21 13:18
2004.05.23
Установка Firebird на комп вручную...


6-1080897789
mazepa
2004-04-02 13:23
2004.05.23
TelNet


6-1080943879
lena19
2004-04-03 02:11
2004.05.23
отключение от сервера


1-1083949911
LAnd
2004-05-07 21:11
2004.05.23
Переменные в DLL