Форум: "Сети";
Текущий архив: 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