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


Автор: F1reF0x 13.4.2006, 21:56
Здраствуйте. У меня возникла такая проблемма, я не могу понять как отправить данные от клиента серверу (winsock). Я понимаю что сначало надо отправлять функцией Send, в потом принимать(на серверной стороне) Recv количество, отправленых байт и количство примаемых байт, но не могу понять как эти байты (с информацией) принимать.

Код сервера:

Код

procedure TMainForm.BindButtonClick(Sender: TObject);
var
  WDat: TWSAData;
  BindSock: TSocket;
  Addr: TSockAddr;
  AcceptedSock: TSocket;
  Len: Integer;
  Buff: Pchar;
begin
  WSAStartup(MAKEWORD(2,0), WDat);
  BindSock:= Socket(AF_Inet, Sock_Stream, 0);

  Addr.sin_family:= AF_INET;
  Addr.sin_port:=  htons(StrToInt(PortEdit.Text));
  Addr.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));

  Bind(BindSock, Addr, SizeOf(Addr));
  Len:= SizeOf(TSockAddr);
  AcceptedSock:= Accept(BindSock, @Addr, @Len);
  Listen(BindSock, SoMaxConn);
  Recv(BindSock, Buff, SizeOf(Buff), 0);
  // Насколько я понимаю после этой строчки надо начать принимать байты, вопрос в том как.
end;


Код клиента:

Код

procedure TMainForm.ConnectButtonClick(Sender: TObject);
var
  WDat: TWSAData;
  ConnectSock: TSocket;
  Addr: TSockAddr;
  SendBuff: PChar;
begin
  WSAStartup(MAKEWORD(2,0), WDat);
  ConnectSock:= Socket(AF_Inet, Sock_Stream, 0);

  Addr.sin_family:= AF_INET;
  Addr.sin_port:=  htons(StrToInt(PortEdit.Text));
  Addr.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));

  Connect(ConnectSock, Addr, SizeOf(Addr));
  Send(ConnectSock, SendBuf, SizeOf(SendBuf), 0);
end;


Заранее спасибо.

P.s Поиск по форуму не дал результатов

Автор: this 13.4.2006, 23:51
Listen нужно вызывать до Accept, т.е. сначала установить сокет на прослушивание, а уже потом аццептить клиента.
Recv(BindSock, Buff, SizeOf(Buff), 0); - вот здесь ты и принимаешь данные, только не забудь под Buff выделить память.

Автор: F1reF0x 14.4.2006, 02:19
Код

procedure BindPort(Sender: TObject);
var
  WDat: TWSAData;
  BindSock: TSocket;
  Addr: TSockAddr;
  AcceptedSock: TSocket;
  Len: Integer;
  Buff: Pchar;
  T: String;
begin
  WSAStartup(MAKEWORD(2,0), WDat);
  BindSock:= Socket(AF_Inet, Sock_Stream, 0);
  Addr.sin_family:= AF_INET;
  Addr.sin_port:=  htons(25555);
  Addr.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));
  Bind(BindSock, Addr, SizeOf(Addr));
  // Биндим порт
  Len:= SizeOf(TSockAddr);
  Listen(BindSock, SoMaxConn);
  // Слушаем порт
  AcceptedSock:= Accept(BindSock, @Addr, @Len);
  // Принимаем соединение
  Recv(BindSock, Buff, 100, 0);
  // Принимаем, выделяем память  
  ShowMessage(Buff);
  //Пустое
End;

procedure TForm1.Button1Click(Sender: TObject);
var
  h2: Cardinal;
begin
  CreateThread(nil, 128, @BindPort, self, 0, h2);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  WDat: TWSAData;
  ConnectSock: TSocket;
  Addr: TSockAddr;
  SendBuff: PChar;
begin
  SendBuff:= PChar('Test');
  WSAStartup(MAKEWORD(2,0), WDat);
  ConnectSock:= Socket(AF_Inet, Sock_Stream, 0);
  Addr.sin_family:= AF_INET;
  Addr.sin_port:=  htons(25555);
  Addr.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));
  Connect(ConnectSock, Addr, SizeOf(Addr));
  Send(ConnectSock, SendBuff, SizeOf(SendBuff), 0);

end;


Так тоже не работает

Автор: RA 14.4.2006, 02:46
Есть старый добрый пример

Автор: F1reF0x 14.4.2006, 13:41
Спасибо

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