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

Вниз

Socket Broadcast - максимальный размер дейтаграммы   Найти похожие ветки 

 
Funtic12 ©   (2008-05-24 14:14) [0]

Добрый день, необходимомо передать широковещательный пакет максимального размера, поискав гугле нашел что размер дейтаграммы равен 56507 (примерно), так при послыке UDP пакета дейтаграмма доходит до назначения, кода же пытаюсь отослать Broadcast то данные больше 1000 непроходят.

Использую Socket.

Если кто то может подсказать в чем дело, или хотя бы ссылкой помоч. Думаю может дело с настройками сети.


 
TForumHelp ©   (2008-05-25 14:57) [1]

Попробуй Indy. а почему именно UDP? имхо - TCP думаю было бы удачнее.


 
Сергей М. ©   (2008-05-25 15:24) [2]


> поискав гугле нашел что размер дейтаграммы равен 56507 (примерно)


Бред сивейшей кобылы = БСК

см. SetSockopt(SO_SNDBUF)


> TForumHelp ©   (25.05.08 14:57) [1]


БСК


 
Funtic12 ©   (2008-05-25 17:23) [3]

TForumHelp

Дело в том что нужна именно Широковещательная рассылка, броадкаст или мультикаст, думаю этим пользуються при вещании радио или видео.
Пробовал Инди Мультикаст там больше 4000 несмог отослать, может дело в сети у меня?

Сергей М

см. здесь.
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1021

Максимальный размер одной дейтаграммы IP равен 65535 байтам. Из них не менее 20 байт занимает заголовок IP. Заголовок UDP имеет размер 8 байт. Таким образом, максимальный размер одной дейтаграммы UDP составляет 65507 байт

Так вот UDP прекрасно работает, но вот когда делаю Широковещательный

SetSockOpt(S,SOL_Socket,SO_Broadcast,PChar(@EnBroad),SizeOf(Integer));

то пакеты с таким размером почему то неидут, 1000 еще можно отправить, хотя может я в чем то ошибаюсь?


 
Сергей М. ©   (2008-05-25 19:26) [4]

SO_SNDBUF <> SO_Broadcast


 
Funtic12 ©   (2008-05-25 22:38) [5]

Сергей М.

Пробовал устанавливать SO_SNDBUF а также и SO_RcvBuf, в различных комбинация и размерах,

 iBufLength := 2000;
 SetSockOpt(Sock,SOL_Socket,SO_Broadcast,PChar(@nBroad),SizeOf(Integer));
 if SetSockOpt(Sock,SOL_Socket,SO_SndBuf,
   @iBufLength,SizeOf(Integer)) = SOCKET_ERROR then
 begin
   ShowMessage("!!!");
 end;

К сожаленью не помогло.
Я не прошу готового решения, но в ваший сообщениях чувствуется уверенность, может быть уже решали эту проблему? и есть рабочее решение?


 
Сергей М. ©   (2008-05-26 09:58) [6]


> не помогло


Приводи код передатчика и приемника ..


 
Funtic12 ©   (2008-05-26 23:55) [7]

сначала само собой
 WSAStartup($101,WSData);

Принимающая сторона
var
 Sock: TSocket;
 Addr, Addr2:TSockAddr;
 FromLen, SizeBuf: Integer;
 getByte: TBytes;
 sAdr: string;
 nBroad: Integer;
 iBufLength,i: Integer;
begin
 // создаем сокет
 Sock := Socket(AF_Inet,Sock_Dgram,IPProto_UDP);

 iBufLength := 2000;

 // Широковещателльный
 nBroad := 1;
 SetSockOpt(Sock,SOL_Socket,SO_Broadcast,PChar(@nBroad),SizeOf(Integer));

 if SetSockOpt(Sock,SOL_Socket,SO_RcvBuf,
   @iBufLength,SizeOf(Integer)) = SOCKET_ERROR then
 begin
   ShowMessage("!!!");
 end;

 // размер передаваемых данных
 SizeBuf := 1000;

 // привязываем сокет к адресу
 Addr.sin_family:=PF_Inet;
 Addr.sin_addr.S_addr:=Inet_Addr("192.168.2.1");
 Addr.sin_port:=HtoNS(3320);
 FillChar(Addr.sin_zero,SizeOf(Addr.sin_zero),0);

 if Bind(Sock,Addr,SizeOf(Addr))=Socket_Error then
 begin
   // какая-то ошибка, анализируем с помощью WSAGetLastError
   ShowMessage("какая-то ошибка, анализируем с помощью WSAGetLastError");
 end;

 // Получаем данные
 getStream.Clear;
 getStream.Position := 0;
 SetLength(getByte,SizeBuf);
 FromLen := SizeOf(TSockAddr);
 
 Recv(Sock,getByte[0],SizeBuf,0);

 getStream.Clear;
 getStream.Position := 0;
 WriteTIdBytesToStream(getStream,getByte);
 
 // Проверяем полученные данные
 getStream.Position := 0;
 MmLog.Lines.Add("Recieve "+IntToStr(idHash.HashValue(getStream,0,SizeBuf-1)));

 // отрубаем сокет
 Shutdown(Sock,SD_Both);
end;

Сторона отправитель

var
 Sock: TSocket;
 Addr:TSockAddr;
 Len, SizeBuf: Integer;
 sStream: TMemoryStream;
 getByte: TBytes;
 nBroad, iBufLength, I: Integer;
begin
 // создаем сокет
 Sock := Socket(AF_Inet,Sock_Dgram,IPProto_UDP);

 // Широковещателльный
 nBroad := 1;
 iBufLength := 1000;

 SetSockOpt(Sock,SOL_Socket,SO_Broadcast,PChar(@nBroad),SizeOf(Integer));
 if SetSockOpt(Sock,SOL_Socket,SO_SndBuf,
   @iBufLength,SizeOf(Integer)) = SOCKET_ERROR then
 begin
   ShowMessage("!!!");
 end;

 // Размер передаваемых данных
 SizeBuf := 1000;

 // привязываем сокет к адресу
 Addr.sin_family:=PF_Inet;
//  Addr.sin_addr.S_addr:=Inet_Addr("192.168.2.1");
 Addr.sin_addr.S_addr:=INADDR_BROADCAST;
 Addr.sin_port:=HtoNS(3320);
 FillChar(Addr.sin_zero,SizeOf(Addr.sin_zero),0);

 gStream.Position := 0;

 MmLog.Lines.Add("Send "+IntToStr(idHash.HashValue(gStream,0,SizeBuf-1)));

 // посылаем данные
 gStream.Position := 0;
 SetLength(getByte,SizeBuf);
 ReadTIdBytesFromStream(gStream,getByte,Length(getByte));
 Len := Length(getByte);

   SendTo(Sock, getByte[0],SizeBuf,0,Addr,SizeOf(TSockAddr));

 // отрубаем сокет
 Shutdown(Sock,SD_Both);

end;

---------------------------------------------------------------
Код конечно карявый. но смысл в том что
 SizeBuf := 1000;
К примеру уже 2000 данные непередаються.
Эксперементировав на другом компьютере прихожу к выводам что скорее всего дело в сети, т.е свитчи или др. сетевые устройства непропускают широковещательные пакеты большого размера, склоняюсь к этому выводу


 
Сергей М. ©   (2008-05-27 07:02) [8]

Где анализ результатов вызовов ф-ций sendto и recv ?



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

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

Наверх




Память: 0.49 MB
Время: 0.038 c
15-1258320614
Юрий
2009-11-16 00:30
2010.01.17
С днем рождения ! 16 ноября 2009 понедельник


15-1258353428
Дмитрий С
2009-11-16 09:37
2010.01.17
Вопрос админам. Как правильно настроить отправку почты.


1-1233308348
kyn66
2009-01-30 12:39
2010.01.17
FileListBox1 - отсутствует сортировка


2-1259176132
DJ Kondakov
2009-11-25 22:08
2010.01.17
Убрать кнопку приложения с Task Bar


3-1233213892
Ruslan777
2009-01-29 10:24
2010.01.17
Клиент серверное приложение!