![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WinSock приходят неверные данные
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;