|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
08.08.2012, 16:56 | #1 |
Регистрация: 18.04.2010
Сообщений: 5
|
Отправка UDP в потоке (winsock)
Добрый день. Кто подсказать может. Имеется код по отправке пакетов UDP. Без потока все работает нормально. Как только этот же код начинает работать в отдельном потоке, так пакеты больше 150 байт не уходят. Кто знает, в чем может быть проблемма.
Отрывок кода: function UDP(p : pointer) : DWORD; stdcall; var SocketHwnd : TSocket; SocketAddr : TSockAddr; sUDPPacket : string; iSleepTime : integer; begin SocketHwnd := Socket(AF_INET,SOCK_DGRAM,IPPROTO_U DP); SocketAddr.sin_family := AF_INET; SocketAddr.sin_addr.S_addr := '192.168.1.100'; SocketAddr.sin_port := htons(5000); . . // sUDPPacket < 150 bytes - отправляется // > нет . . while bGo do begin SendTo(SocketHwnd,sUDPPacket,Length (sUDPPacket),0,SocketAddr,SizeOf(So cketAddr)); sleep(iSleepTime); end; end; // основной поток Windows.CreateThread(nil,0,@UDP,@UD PMessage,0,UDPID); SetThreadPriority(UDPID,THREAD_PRIO RITY_NORMAL); Кто знает, помогите... |
08.08.2012, 17:42 | #2 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
...вызывайте внешний метод отправки из потока через Synchronize().
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
08.08.2012, 18:53 | #3 |
Регистрация: 18.04.2010
Сообщений: 5
|
Попробовал, не помогло.
Оставил sendto в отдельной функции. Если перед первым посылом ставлю задержку, пакеты начинают уходить. Кто в курсе? Последний раз редактировалось NewHorek; 08.08.2012 в 19:43. |
08.08.2012, 19:44 | #4 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
...покажите как пробовали?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
08.08.2012, 19:47 | #5 |
Регистрация: 18.04.2010
Сообщений: 5
|
Уже перетер все. Через потомок от TThread (обычный поток в делфи)
Сейчас соорудил фун-ю procedure M(SocketHwnd : integer; sUDPPacket : string; SocketAddr : TSockAddr); var i : integer; begin i := SendTo(SocketHwnd,sUDPPacket,Length (sUDPPacket),0,SocketAddr,SizeOf(So cketAddr)); MessageBox(0,PChar(IntToStr(i)),'', 0); //sleep(10); end; Если есть sleep - пакеты уходят. Но это ведь не правильно! Может как узнать свободность сокета? Вопрос решил заменой sUDPPacket на динамический массив. Все заработало. Проблемму с предыдущим типом данных так и не понял.... Последний раз редактировалось NewHorek; 08.08.2012 в 20:21. |
08.08.2012, 21:45 | #6 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
...пакет не может быть неограниченной длины, да и для UDP пакеты лучше делать фиксированными и поменьше.
Насчет того, как синхронизировали, вы не показали, да и уже неактуально . Удачи.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
09.08.2012, 10:37 | #7 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Сейчас попробуем помочь из твоего примера
Последний раз редактировалось Aliens_wolfs; 09.08.2012 в 10:47. |
09.08.2012, 10:37 | #8 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Вот накидал простенький поток из твоего примера должен работать
Код:
Еще можно сделать из класса TThread создать его тело и через него можно реализовать и передачу и прием данных Последний раз редактировалось Aliens_wolfs; 09.08.2012 в 11:23. |
12.08.2012, 19:02 | #9 |
Регистрация: 18.04.2010
Сообщений: 5
|
Спасибо за пример. Учту. Правда вопрос решил применением динамических массивов. Причем:
massiv: array of byte; SetLength(masssiv, len); 1. SendTo(handle, masssiv[0],... -работает, Пакеты приходят (использовал commview) , причем, длина не имеет значения (ну логично < 65535 bytes). CommView показывает один пакет = MTU, остальные как defragment ( в сумме = len ). Не понял проблемму с типом string? Почему поток отказывается работать. Вот этого я не вкурил Еще 1 фишка - данные при типе string (delphi 7, без unicode) в пакете не соответстуют исходным. При динамическом массиве все ОК... Ладно бы я понял там смещение на пару байт в string с учетом организации строк паскаля. Но ведь нет. Бред какой-то. приходит. Предположение: Поток, организованный CreateThread и BeginThread - отличаются в работе со строками (изменения в диспетчере пямяти не в счет) Причем поток работает сам по себе, основной поток его только запускает, никаких синхронизаций данных не требуется, он сам в себе... Последний раз редактировалось NewHorek; 12.08.2012 в 19:22. |
12.08.2012, 19:50 | #10 | |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
Цитата:
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
WinSock сервер в потоке | vgbox | Работа с сетью в Delphi | 1 | 03.03.2012 06:42 |
winsock udp сервер в потоке, не работает при создании формы или обращению к VCL компоненту | marikcool | Работа с сетью в Delphi | 1 | 01.10.2010 00:57 |
Winsock: UDP сервер под Win | студент_88 | Win Api | 0 | 05.09.2010 22:01 |
WinSock, UDP, широковещание; delphi (pascal) | svchaos | Работа с сетью в Delphi | 5 | 02.06.2009 14:44 |
WinSock, UDP, широковещание: Delphi (Pascal) | svchaos | Помощь студентам | 8 | 01.06.2009 20:41 |