Главная страница
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.53 MB
Время: 0.031 c
2-1143465999
worldmen
2006-03-27 17:26
2006.04.09
Как использовать Table.Filter


10-1116407057
Uli
2005-05-18 13:04
2006.04.09
Удалить все закладки


4-1138077362
Atheist
2006-01-24 07:36
2006.04.09
Нестандартный edit (получение текста)


15-1142411255
LordOfRock
2006-03-15 11:27
2006.04.09
Подскажите с PHP


4-1137994529
novikova
2006-01-23 08:35
2006.04.09
Работа через модем в режиме ЗАПРОС-ОТВЕТ