Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.09;
Скачать: CL | DM;

Вниз

WinSock приходят неверные данные   Найти похожие ветки 

 
syned ©   (2005-12-26 12:35) [0]

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


 
Slym ©   (2005-12-26 12:47) [1]

Стандартная ошибка:
Отправляешь/Принимаень указатель на буфер, а не буфер (то что оребуется)


 
syned ©   (2005-12-26 12:51) [2]

буффер описываю как массив байт
buf : array of byte
и передаею именно buf, если передать buf^ пишет, pointer type required


 
Slym ©   (2005-12-26 12:58) [3]

syned ©   (26.12.05 12:51) [2]
Незя так!
Динамический массив низя!
Код отсылки приема в студию


 
Reindeer Moss Eater ©   (2005-12-26 12:59) [4]

Динамические массивы D несовместимы с требуемым здесь типом массива байт.


 
syned ©   (2005-12-26 13:03) [5]

WSAStartup($0101, data);
 s := socket(AF_INET,SOCK_DGRAM,0);
 // заполнение addr
 addr.sin_family := AF_INET;
 addr.sin_port := htons(55566);

 FillChar(addr.sin_zero,sizeof(addr.sin_zero),0);

   len := sizeOf(TSockAddr);
 t := SendTo(s,buf,Length(Edit1.Text),0,addr,len);
 if t <> Length(Edit1.Text) then
   ShowMessage("Error send")
 else
   ShowMessage("Send complete");


 
syned ©   (2005-12-26 13:04) [6]

buf, был динамическим массивом...


 
Slym ©   (2005-12-26 13:04) [7]

WSAStartup($0101, data);
s := socket(AF_INET,SOCK_DGRAM,0);
// заполнение addr
addr.sin_family := AF_INET;
addr.sin_port := htons(55566);

FillChar(addr.sin_zero,sizeof(addr.sin_zero),0);

  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");


 
syned ©   (2005-12-26 13:05) [8]

прием:

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;


 
syned ©   (2005-12-26 13:06) [9]

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


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

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


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

В приеме ошибки:
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:15) [12]

а в посылке?


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

Не ты гонишь...
Работает:
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;


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

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


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

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


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

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


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

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


 
Slym ©   (2005-12-26 13:24) [18]

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


 
syned ©   (2005-12-26 13:25) [19]

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


 
Slym ©   (2005-12-26 13:26) [20]

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


 
Verg ©   (2005-12-26 13:28) [21]


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


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


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


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


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

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


 
Verg ©   (2005-12-26 13:31) [23]


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


А я оп чем?


 
syned ©   (2005-12-26 13:34) [24]

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


 
Verg ©   (2005-12-26 13:34) [25]

Verg ©   (26.12.05 13:20) [14]


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

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


 
syned ©   (2005-12-26 13:46) [27]

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



Страницы: 1 вся ветка

Текущий архив: 2006.04.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
4-1137854444
Qstream
2006-01-21 17:40
2006.04.09
USB i D.


6-1135668708
vista
2005-12-27 10:31
2006.04.09
извлечь текст из html страницы.без html-тегов


2-1143444583
ms_odin
2006-03-27 11:29
2006.04.09
Как обойти привелегированную инструкцию для записи в порт?


2-1143240003
Locke
2006-03-25 01:40
2006.04.09
перемещение региона вместе с формой которую он ограничивает


3-1139687196
veb
2006-02-11 22:46
2006.04.09
Ограничения ADOTable.Filter





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский