Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.011 c
3-1140073857
Scorpio
2006-02-16 10:10
2006.04.09
Пароль на БД Paradox 7


2-1142995830
TimScorp
2006-03-22 05:50
2006.04.09
Проверка одинаковых значений в таблице


15-1142573326
Геро
2006-03-17 08:28
2006.04.09
.NET — оболочка над Win32?


4-1137944963
Dyakon_Frost
2006-01-22 18:49
2006.04.09
Отключение системных служб


15-1142350792
Vlad
2006-03-14 18:39
2006.04.09
А кто-нибудь знает, новый закон о рекламе вступил в силу?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский