내 onvif 클라이언트 응용 프로그램에서 gsoap 및 wsddapi.c를 사용하여 WS-Discovery를 구현하려고하지만 처리기에 문제가 있습니다. 내가 soap_wsdd_probe (wsddapi.c)와 UDP를 통해 멀티 캐스트 메시지를 보낼 수 있습니다, 나는 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;
}
이벤트 처리기가 wsddapi.c에 내가 UDP를 받기 위해 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의 probmatches는 SOAP_WSDD_MANAGED가 아닌 SOAP_WSDD_ADHOC를 사용하는 경우에만 호출됩니다 ... 더 이상합니다. soap_wsdd_Probe()에서 이벤트 처리기를 호출 할 때 wsddapi.c에서 (;;)과 같은 루프를 사용하면 대상 서비스의 모든 probematches를 볼 수 있습니다. 내가 옳은 길로 생각하는 것이 더 이상하다. – 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에서 예제를 사용하고 있습니다. 정상적으로 prob를 사용했습니다. 그러나 server.cpp를 컴파일하면 오류가 발생합니다. 오류 : 'setsockopt (serv-> master, IPPROTO_IP, int)'에 대해 'ip_mreq *'를 'const char *'로 '4'에서 'int setsockopt (SOCKET, int, int, const char *, int)'로 변환 할 수 없습니다. IP_ADD_MEMBERSHIP, mcast, sizeof (mcast)) <0) ' 어떻게 해결할 수 있습니까? –