Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.045 c
3-1083135955
Dina
2004-04-28 11:05
2004.05.23
существование поля в таблице INTERBASE ?


7-1082164913
Ivanov
2004-04-17 05:21
2004.05.23
Время из системных часов


3-1082983559
Sirruf
2004-04-26 16:45
2004.05.23
Кэшированные изменения в Interbase Express


8-1078899334
Галинка
2004-03-10 09:15
2004.05.23
Как повернуть картинку на произвольный угол?


3-1083179959
sasa
2004-04-28 23:19
2004.05.23
Тормоза IBSERVER под Win2KServer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский