Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с приемом информации winsock, не принимает данные 
:(
    Опции темы
Incinerated
Дата 26.12.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Есть клиент:
Код

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 
PM MAIL   Вверх
kami
Дата 26.12.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(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);



Это сообщение отредактировал(а) kami - 26.12.2009, 23:17
PM MAIL WWW   Вверх
dvamaster
Дата 28.12.2009, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 2
Всего: 10



Цитата(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 секунд
и все это одноклиентное и с потоками проблемы будут


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.