powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / winsock широковещательный UDP
6 сообщений из 6, страница 1 из 1
winsock широковещательный UDP
    #35003348
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В моей корпоративной системке написаной на VFP6 и VFP8
есть клиенты и сервера приложений
взаимодействие клиентов с серверами приложений я вроде освоил (winsock.ocx IP)
разобрался и с обменом по UDP
для работы всего этого приходится на каждом клиенте прописывать список рабочих серверов приложений.
А хочется: клиент в сеть "кричит": "где сервера" , а сервера отвечают сообщая свои IP.

по наслышке знаю что по протоколу UDP можно отправить "широковещательный пакет"
но используя winsock.ocx не удается этого добится
вычитал в инете про свойство SO_Broadcast, но в в моем MS winsock 6 такового свойства нет.
Вопросы:
это ограничение MS winsock вообще ?
какой-то другой ocx мне поможет?
посоветуйте пожалуйста хоть какой способ решения.
...
Рейтинг: 0 / 0
winsock широковещательный UDP
    #35004862
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну в теории я вроде освоился
смирился с ограниченим winsock.ocx
кажется меня может спасти winsock.dll и win2_32.dll ,
но все найденные мною примеры содержать константы типа AF_INET, SOCK_DGRAM, IPPROTO_UDP
а как они определены? файла winsock.h найти не могу
...
Рейтинг: 0 / 0
winsock широковещательный UDP
    #35005459
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Широковещательный пакет - это просто пакет на адрес 255.255.255.255
...
Рейтинг: 0 / 0
winsock широковещательный UDP
    #35006280
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
наваял вот такой код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
#DEFINE WSADATA_SIZE  398 
#DEFINE WS_VERSION 0x0202
#define AF_INET  2 
#define SOCK_DGRAM  2  && Connectionless, unreliable datagrams   of fixed maximum length.  
#define IPPROTO_UDP  17 
#define SO_BROADCAST 0x0020
#define SOL_SOCKET 0xffff 

DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING  @ lpWSAData
DECLARE INTEGER WSACleanup IN ws2_32
DECLARE INTEGER socket IN ws2_32 INTEGER af, INTEGER type, INTEGER protocol
DECLARE INTEGER closesocket IN ws2_32 INTEGER s
DECLARE INTEGER setsockopt IN ws2_32;
    INTEGER s, INTEGER level, INTEGER optname,  STRING  @ optval,INTEGER optlen
DECLARE INTEGER sendto IN ws2_32;
    INTEGER s, STRING @buf,INTEGER buflen, INTEGER wsflags,STRING @sendto,INTEGER tolen

cWSADATA = Repli(Chr( 0 ), WSADATA_SIZE)
? WSAStartup(WS_VERSION, @cWSADATA)
S=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
bc_true=chr( 1 )
? setsockopt (s,SOL_SOCKET,SO_BROADCAST, @bc_true,  1 )
a="hello"
? sendto(s,@a,len(a),...                 )
?closesocket(s)
? WSACleanup()
загвоздка в sendto
по описанию требуется указать указатель на структуру sockaddr
(в которой указан порт и адрес)
вот как бы создать и заполнить эту структурку из фокса?
...
Рейтинг: 0 / 0
winsock широковещательный UDP
    #35008528
Декоратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
winsock широковещательный UDP
    #35009561
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Декоратор тынц
Этот тынц я много раз смотрел - не мой случай: вне нужен UDP а там описан TCP

врочем наконец то сам разобрался
Правельный код с использованием winapi будет такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
#DEFINE WS_VERSION 0x202
#DEFINE WSADATA_SIZE  512 
#DEFINE AF_INET  2  
#DEFINE SOCK_DGRAM  2  
#DEFINE IPPROTO_UDP  17  
#DEFINE SOCKET_ERROR - 1  
#DEFINE SOL_SOCKET 0xFFFF 
#DEFINE SO_BROADCAST 0x20 

DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING  @ lpWSAData
DECLARE INTEGER WSACleanup IN ws2_32
DECLARE INTEGER socket IN ws2_32 INTEGER af, INTEGER type, INTEGER protocol
DECLARE INTEGER closesocket IN ws2_32 INTEGER s
DECLARE INTEGER setsockopt IN ws2_32;
    INTEGER s, INTEGER level, INTEGER optname,  STRING  @ optval,INTEGER optlen
DECLARE INTEGER htons IN WS2_32.DLL INTEGER hostshort 
DECLARE INTEGER sendto IN ws2_32;
    INTEGER s, STRING @buf,INTEGER buflen, INTEGER wsflags,STRING @sendto,INTEGER tolen
DECLARE INTEGER inet_addr IN ws2_32;
    STRING cp
DECLARE INTEGER bind IN ws2_32 As ws_bind;
    INTEGER  s, STRING @ sockaddr,INTEGER  namelen
DECLARE INTEGER gethostname IN ws2_32 STRING  @ name, INTEGER   namelen
DECLARE INTEGER gethostbyname IN ws2_32 STRING hostname
DECLARE STRING inet_ntoa IN ws2_32 INTEGER in_addr
clear
cWSADATA = Repli(Chr( 0 ), WSADATA_SIZE)
? WSAStartup(WS_VERSION, @cWSADATA)
S=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
		m.cPort = WordToStr(htons( 5551 )) 
		m.cIP = dWordToStr(inet_addr("169.254.191.52")) 
		m.cRemoteAddr = WordToStr(AF_INET) + m.cPort + m.cIP + REPLICATE(CHR( 0 ), 8 ) 
		m.cOptval = REPLICATE(CHR( 255 ), 4 ) 

		m.nResult = setsockopt(S, SOL_SOCKET, SO_BROADCAST, @cOptval, LEN(m.cOptval)) && mode broadcast 
		IF m.nResult <> SOCKET_ERROR 
			m.cBuff="hello"
			m.nResult = sendto(S, @cBuff, LEN(m.cBuff),  0 , @cRemoteAddr, LEN(cRemoteAddr)) 
			m.lOK = (m.nResult <> SOCKET_ERROR) 
		ENDIF 
?closesocket(s)
? WSACleanup()
return

FUNCTION dWordToStr
LPARAM nValue 
LOCAL nB0, nB1, nB2, nB3 
IF m.nValue <  0  
	m.nValue =  2 ^ 32  + m.nValue 
ENDIF 
m.nB3 = BITRSHIFT(m.nValue,  24 ) 
m.nB2 = BITRSHIFT(m.nValue - m.nB3* 2 ^ 24 ,  16 ) 
m.nB1 = BITRSHIFT(m.nValue - m.nB3* 2 ^ 24  - m.nB2* 2 ^ 16 ,  8 ) 
m.nB0 = MOD(m.nValue,  2 ^ 8 ) 
RETURN CHR(m.nB0)+CHR(m.nB1)+CHR(m.nB2)+CHR(m.nB3) 

FUNCTION WordToStr 
LPARAM nValue 
RETURN CHR(MOD(nValue, 256 )) + CHR(INT(nValue/ 256 )) 

но в конце концов он мне не понадобился
winsock.ocx всетаки отлично передает и принимает широковещательные udp без настройки SO_Broadcast
моя загвоздка оказалась в том что для того что бы таковые стали приниматся на серверном winsock надо прописать removePort , и removeHost =localIP и хоть раз выполнить senddata.
впрочем наверно эти хитрые действия както заменяются bind() -пока не разобрался
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / winsock широковещательный UDP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]