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


Автор: Incinerated 26.12.2009, 20:37
Есть клиент:
Код

program ProjectClient;

uses
  SysUtils,WinSock,Windows;

var
  D:WSAData;
  S:TSocket;
  A:TSockAddr;
  send_bytes:Integer;
  str: PChar;

begin
if WSAStartup(MakeWord(2,2),D)<>0 then
begin
  writeln('error..');
  exit;
end;
s := socket(AF_INET,SOCK_STREAM,0);
if (s = 0) then
begin
  WSACleanup();
  exit;
end;

A.sin_family := AF_INET;
A.sin_port := htons(3333);
A.sin_addr.s_addr := inet_addr('127.0.0.1');

if(connect(s,A,sizeof(A)) <> SOCKET_ERROR) then
begin
  Str := 'Hello';
  send_bytes:= send(s,Str,Length(Str),0);
end;

closesocket(s);
WSACleanup;

end.

посылающий серверу строчку "Hello"... в send_bytes всегда 5, т.е. нормально...
есть сервер:
Код

program ProjectServer;

uses
  SysUtils,WinSock,Windows;

var
  D:WSAData;
  S,SClient:TSocket;
  A,ClientAddr:TSockAddr;
  client_addr_size:Integer;
  thID: DWord;

procedure WorkWithClient(client_socket: array of Pointer); stdcall;
var socket: TSocket;
    bytes_recv: integer;
    buff: array [0..50] of char;
    Str: String;
begin
  socket:= TSocket(client_socket[0]);
  bytes_recv := 0;
  FillChar(buff,sizeof(buff),#0);
  while (bytes_recv <> SOCKET_ERROR) do
  begin
    bytes_recv := recv(socket,buff,sizeof(buff),0);
//в buff всегда белиберда получается
    if (bytes_recv > 0) then
    begin
      Str := String(buff);
      writeln(Str);
    end;
  end;
closesocket(socket);
end;


begin
if WSAStartup(MakeWord(2,2),D)<>0 then
begin
  writeln('error..');
  exit;
end;
s := socket(AF_INET,SOCK_STREAM,0);
if (s = 0) then 
begin
  WSACleanup();
  exit;
end;

A.sin_family := AF_INET;
A.sin_port := htons(3333);
A.sin_addr.s_addr := htonl(INADDR_ANY);

if (bind(s,a,sizeof(a)) <> 0) then
begin
  closesocket(s);  // закрываем сокет!
  WSACleanup();
  exit;
end;

if (listen(s, $100) <> 0) then
begin
  closesocket(s);
  WSACleanup();
  exit
end;

client_addr_size := sizeof(ClientAddr);

while(true) do
begin
SClient := accept(s, @ClientAddr, @client_addr_size);
CreateThread(nil,0,@WorkWithClient,@SClient,0,thID);
Sleep(500);
end;

end.

вот, в переменной buff всегда получается ерунда, мусор какой то... а надо бы "Hello" чтобы принялось... пробывал следующие варианты, кроме описанного выше:
Код

buff: PChar;
bytes_recv := recv(socket,buff,sizeof(buff),0);

Код

buff: ^PChar;
bytes_recv := recv(socket,buff,sizeof(buff),0);

Код

buff: array of Char;
setlength(buff,10);
bytes_recv := recv(socket,buff,sizeof(buff),0);

во всех случаях ерунда получается в буфере, что я не так делаю?  smile 

Автор: kami 26.12.2009, 23:15
Цитата(Incinerated @  26.12.2009,  20:37 Найти цитируемый пост)
 
buff: array [0..50] of char;    
bytes_recv := recv(socket,buff[0],sizeof(buff),0); // тут надо посмотреть под отладчиком, сколько будет SizeOf(buff)


Цитата(Incinerated @  26.12.2009,  20:37 Найти цитируемый пост)

buff: PChar;
bytes_recv := recv(socket,buff^,buff_length,0);// SizeOf(buff) = 4 - размер указателя.


ку?

Добавлено через 2 минуты и 37 секунд
Цитата(Incinerated @  26.12.2009,  20:37 Найти цитируемый пост)
send_bytes:= send(s,Str^,Length(Str),0);


Автор: dvamaster 28.12.2009, 07:20
Цитата(Incinerated @  26.12.2009,  23:37 Найти цитируемый пост)
CreateThread(nil,0,@WorkWithClient,@SClient,0,thID);


здесь ты передаешь указатель на сокет

Цитата(Incinerated @  26.12.2009,  23:37 Найти цитируемый пост)
procedure WorkWithClient(client_socket: array of Pointer); stdcall;


здесь ты принимаешь параметр не указатель на сокет а указатель на массив сокетов

Код

procedure WorkWithClient(client_socket: Pointer); stdcall;
...
begin
  socket:= TSocket(client_socket^);
  ...
end;


Добавлено через 1 минуту и 18 секунд
и все это одноклиентное и с потоками проблемы будут

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