Форум: "Сети";
Текущий архив: 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