В моем клиентском приложении onvif я ищу для реализации WS-Discovery с gsoap и wsddapi.c, но у меня проблемы с обработчиком. Я могу отправить многоадресное сообщение через UDP с помощью soap_wsdd_probe (wsddapi.c), я внедрил soap_bind, прослушивание и wsdd_event_probematches, но я не получаю сообщение от Сервиса.ONVIF WS-Discover 1.0 - Обработчики клиентов и событий
/*MY CLIENT*/
#include "wsdd.nsmap"
#include "soapH.h"
#include "wsddapi.h"
int main() {
struct soap* soap=soap_new();
struct soap* serv=soap_new(); //for the listner and the event handler
int time=100, port=53881;
if (!soap_valid_socket(soap_bind(soap, NULL, port, 100)))
{ soap_print_fault(soap, stderr);
exit(0);
}
soap->connect_flags=SO_BROADCAST;
const char * msg_uuid = NULL;
msg_uuid=soap_wsa_rand_uuid(soap);
soap_wsdd_Probe(soap, SOAP_WSDD_ADHOC, SOAP_WSDD_TO_TS,"soap.udp://239.255.255.250:3702",msg_uuid, NULL,"dp0:NetworkVideoTransmitter","", NULL);
soap_wsdd_listen(serv, 2); // listen for messages
soap_destroy(soap);
soap_end(soap);
soap_done(soap);
return 0;
}
Event Handler в wsddapi.c я реализовал wsdd_event_probematches()
void wsdd_event_ProbeMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, struct wsdd__ProbeMatchesType *matches){
printf("MessageID:%s",MessageID);
printf("%s",matches->ProbeMatch->XAddrs);
}
Я попробовал ваш код, но не работает ... если вы отладку вы можете увидеть, что обработчик событий ошибок в wsddapi.c является вызовом, только если вы используете SOAP_WSDD_MANAGED, а не SOAP_WSDD_ADHOC ... это более странно. и если вы используете цикл, как для (;;) в wsddapi.c, когда вызывается обработчик события в soap_wsdd_Probe(), вы можете увидеть все пробные номера из целевой службы. Это более странно, я думаю, это не правильный путь. – Luca84
@ Luca84 в режиме SOAP_WSDD_ADHOC, обработчик wsdd_event_ProbeMatches называется обработкой сообщения ProbeMatches (из __wsdd__ProbeMatches). Вы можете найти мои попытки из github https://github.com/mpromonet/ws-discovery/tree/master/gsoap. Я успешно запускаю его с помощью gSOAP 2.8.7 и gSOAP 2.8.17. – mpromonet
Привет @mpromonet, я использую ваш пример в gitHub. Обычно я использовал проблему. Но когда компилируется server.cpp, он дает ошибку. error: невозможно преобразовать 'ip_mreq *' в 'const char *' для аргумента '4' to 'int setsockopt (SOCKET, int, int, const char *, int)' if (setsockopt (serv-> master, IPPROTO_IP, IP_ADD_MEMBERSHIP, & mcast, sizeof (mcast)) <0) ' Как я могу решить эту проблему? –