Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Клиент-Сервер-Клиент


Автор: ne0n 20.9.2008, 11:30
Привествую всех!
Вообщем задача достаточно простая: Клиент передает серверу запрос\команду, и  на нее сервер должен пересалть клиенту ответ. вообщем с передачей запросов серверу не возникло(кстати пока разбирался нашел ошибку в статье из Drkb "Создание сетевых приложений на Delphi с использованием Windows Sockets API" если кому интересно раскажу в чем там проблема была). как я понял для того чтобы переслать ответ нельзя использовать тот же сокет. Т.е. это надо опять надо создавать сокет, сервер будет конектиться уже к клиенту, а у клиент будет роослушивать порт и принимать ответ. собственно вопрос такой, правильно я мыслю?) smile 

Автор: Matematik 20.9.2008, 15:01
> как я понял для того чтобы переслать ответ нельзя использовать тот же сокет.

Можно. Вообще с чего ты это взял?

Автор: BaD_SeCt0R 20.9.2008, 15:26
Цитата(ne0n @  20.9.2008,  11:30 Найти цитируемый пост)
вопрос такой, правильно я мыслю?

Нет smile

Автор: ne0n 20.9.2008, 18:06
Цитата(Matematik @  20.9.2008,  15:01 Найти цитируемый пост)
Можно. Вообще с чего ты это взял?


дык попробовал и не получилось) да и потмо знакомый мне с пеной у рта доказывал что надо создать второй сокет и будет все норм...мне это показалось бредом, поэтому и решил сначало спросить на форуме smile делал также как выше упомянутой статье: 
Код

....
//подключение клиента к серверу

repeat
//Ожидаем подключения.
vWorkSocket := accept(vSocket,nil,nil);
//Клиент подключился, запускаем новый процесс на соединение.
CreateThread(nil,0,@SocketThread,0,0,trId);
until false;


тоже самое сделал в клиенте.
в SocketThread идет проверка на INVALID_SOCKET, и получаю что vWorkSocket как раз INVALID_SOCKET. Такое чуство что надо еще чтото сделать, но никак не пойму что)


Автор: Matematik 20.9.2008, 19:49
> в SocketThread идет проверка на INVALID_SOCKET, и получаю что vWorkSocket как раз INVALID_SOCKE
Где-то у тебя в коде ошибка.

Чисто для примера, сокет подключившегося клиента передается через параметр в CreateThread() -> ClientProc()
Прекрасно работает, принимает и отсылает данные по одному сокету, легко проверяется в telnet
Код

type
  PThreadParameter = ^TThreadParameter;
  TThreadParameter = record
    ClientSocket : TSocket;
    {...}
  end;

procedure ClientProc(P: Pointer); stdcall;
var
  cli : integer;
  dat : Char;
begin
  cli := PThreadParameter(p)^.ClientSocket;
  while dat<>#13 do
  begin
    recv(cli, dat, SizeOf(dat), 0);
    send(cli, dat, SizeOf(dat), 0);
  end;
  closesocket(cli);
  Dispose(p);
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  wsaData: TWSAData;
  ServerSocket: TSocket;
  ClientSocket: TSocket;
  SockAddr: TSockAddr;
  i : Integer;
  h : THandle;
  Param : PThreadParameter;
begin
  wsaStartup($101, wsaData);
  ServerSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
  ZeroMemory(@SockAddr, SizeOf(SockAddr));
  SockAddr.sin_family := AF_INET;
  SockAddr.sin_port := htons(12345);
  if bind(ServerSocket, SockAddr, SizeOf(SockAddr))<>0 then
    Exit;
  if listen(ServerSocket, 0)<>0 then
    Exit;

  repeat
    i := SizeOf(SockAddr);
    ClientSocket := accept(ServerSocket, @SockAddr, @i);
    New(Param);
    Param^.ClientSocket := ClientSocket;
    CreateThread(nil, 0, @ClientProc, Param, 0, h);
  until False;

end;

Автор: ne0n 21.9.2008, 00:34
Цитата(Matematik @  20.9.2008,  19:49 Найти цитируемый пост)
Где-то у тебя в коде ошибка.


ммм тогда буду искать ошибку, спасибо за пример.

Автор: BaD_SeCt0R 21.9.2008, 04:15
ne0n, разбери работу с сокетами на стандартных TClientSocket/TServerSocket сначала, тогда подобные вопросы сразу отпадут smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)