Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WinSock приходят неверные данные


Страницы:   1 2

syned ©   (2005-12-26 12:35:00) 

Помогите если кто сталкивался с таокй проблемой, отправляю данные с клиентского приложения, все нормально данные уходят(смотрел в дебаггере), на сервер данные приходят, считывается такое же количество байт как и отправляется, но данные искажаются...


syned   (2005-12-26 13:46:00) [1]

спасибо большое, оба варианта работают :)


syned   (2005-12-26 13:39:00) [2]

щас, перепробую все, потому что я еще и бок нашел :( TT


Verg   (2005-12-26 13:34:00) [3]

Verg ©   (26.12.05 13:20) [14]


syned   (2005-12-26 13:34:00) [4]

тогда мне же нужно передать именно ссылку на первый элемент, или я чета недопонимаю


Verg   (2005-12-26 13:31:00) [5]


> syned ©   (26.12.05 13:30) [22]
> так мне нужно использовать buf как динамический массив?


А я оп чем?


syned   (2005-12-26 13:30:00) [6]

так мне нужно использовать buf как динамический массив?


Verg   (2005-12-26 13:28:00) [7]


> syned ©   (26.12.05 12:51) [2]
> буффер описываю как массив байт
> buf : array of byte


Такие массивы индексируются с нуля, в отличии от строк.


> syned ©   (26.12.05 13:22) [16]
> Verg
> а зачем мне первая ячейка?


Тебе не надо, а sendto нужна ссылка на область данных. Вот ссылка на первый элемент массива и выполняет роль ссылки на весь массив.


Slym   (2005-12-26 13:26:00) [8]

Slym ©   (26.12.05 13:24) [18]
WSAGetLastError


syned   (2005-12-26 13:25:00) [9]

Slym
да в t хранится -1


Slym   (2005-12-26 13:24:00) [10]

if t <> Length(Edit1.Text) then
RaiseLastOSError;


Slym   (2005-12-26 13:23:00) [11]

Verg ©   (26.12.05 13:20) [14]
buf[0] ? что ты думаешь там увидеть? (buf[1] - как вариант)


syned   (2005-12-26 13:22:00) [12]

Verg
а зачем мне первая ячейка?


syned   (2005-12-26 13:21:00) [13]

не, у меня SendTo возвращает -1


Verg   (2005-12-26 13:20:00) [14]

t := SendTo(s,buf[0], Length(buf),0,addr,len);


Slym   (2005-12-26 13:17:00) [15]

Не ты гонишь...
Работает:
procedure TForm1.Button1Click(Sender: TObject);
var
 data:TWSAData;
 s:THandle;
 addr:TSockAddr;
 len,t:integer;
begin
 WSAStartup($0101, data);
 s := socket(AF_INET,SOCK_DGRAM,0);
 FillChar(addr.sin_zero,sizeof(addr.sin_zero),0);
 addr.sin_family := AF_INET;
 addr.sin_port := htons(55566);
 len := sizeOf(TSockAddr);
 t := SendTo(s,PChar(Edit1.Text)^,Length(Edit1.Text),0,addr,len);
 if t <> Length(Edit1.Text) then
   ShowMessage('Error send')
 else
   ShowMessage('Send complete');
end;


syned   (2005-12-26 13:15:00) [16]

а в посылке?


Slym   (2005-12-26 13:12:00) [17]

В приеме ошибки:
1. Размер принимаемых данных от фонаря?
2.
если
buf:PChar;
size:integer;
то
GetMem(buf,size+1);// +1 на всякий случай
recvfrom(sock,buf^,size,0,sockAddrr,len)
sendto(sock,buf^,size,0,sockAddrr,len)
FreeMem(buf);

или buf:string;
size:integer;
SetLength(buf,size);
recvfrom(sock,PChar(buf)^,size,0,sockAddrr,len)
sendto(sock,PChar(buf)^,size,0,sockAddrr,len)


syned   (2005-12-26 13:10:00) [18]

Slym
по твоему коду даже не отсылает
SendTo - возвращает (-1)


syned   (2005-12-26 13:06:00) [19]

здесь buf - не динамический


syned   (2005-12-26 13:05:00) [20]

прием:

procedure TForm1.WMSocketEvent(var msg : TMessage);
var
 sock : TSocket;
 sockError : integer;
 sockAddrr : TSockAddr;
 len : integer;
begin
 sock := TSocket(msg.WParam);
 sockError := WSAGetSelectError(msg.LParam);
 if sockError <> 0 then
   begin
     ShowMessage('Ошибка!');
     closesocket(sock);
     Exit;
   end;
 case WSAGetSelectEvent(msg.LParam) of
   FD_READ :
     begin
       if recvfrom(sock,buf,sizeOf(buf),0,sockAddrr,len) = SOCKET_ERROR then
         ListBox1.Items.Add('Ошибка')
       else
         begin
//            ListBox1.Items.Add(buf);
           if sendto(sock,buf,sizeOf(buf),0,sockAddrr,len) = SOCKET_ERROR then
             ListBox1.Items.Add('Не удалось послать ответ')
           else
//              ListBox1.Items.Add('Данные ' + buf + ' удачно отправлены');
         end;
     end;

   FD_ACCEPT :
     begin
       accept(sock,nil,nil);
       ListBox1.Items.Add('Подключение...');
     end;

   FD_CLOSE :
     begin
       shutdown(sock,SD_SEND);
       closesocket(sock);
     end;
 end;
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо