Einfacher SIP Request mit C++
-
Hi ich versuche gerade mich ein bisschen mit dem SIP und UDP Protokoll vertraut zu machen, scheitere jedoch schon an einem ganz simplen Request.
char cBuf[256]; char ip[INET_ADDRSTRLEN]; int s=0, iCheck=0; s=socket(AF_INET, SOCK_DGRAM, NULL); // UDP Socket erstellen struct sockaddr_in addr; struct hostent *heAddr; heAddr = gethostbyname("sip.1und1.de"); // 1und1 als Test inet_ntop (AF_INET, heAddr->h_addr_list[0], ip, INET_ADDRSTRLEN); printf("IP: %s\n", ip); // nur zum Testen, ob die IP richtig ist addr.sin_addr.s_addr = inet_addr(ip); addr.sin_port = htons(5060); addr.sin_family = AF_INET; // der folgende SIP request sollte nicht funktionieren aber doch zumindest eine Antwort bekommen, oder? char cMessage[]="INVITE test SIP/2.0\r\n\r\n"; iCheck=sendto(s, cMessage, strlen(cMessage), NULL, (sockaddr*)&addr, sizeof(addr)); printf("Gesendete Zeichen: %i\n", iCheck); printf("Gesendete Nachricht: %s\n", cMessage); unsigned int iFLen=sizeof(sockaddr_in); iCheck=recvfrom(s, &cBuf, 255, MSG_DONTWAIT, (sockaddr*)&addr, &iFLen); printf("Empfangene Zeichen: %i\n", iCheck); printf("Empfangene Nachricht: %s\n", cBuf); printf("Errno: %i\n", errno); close(s);Folgende Ausgabe wird erzeugt:
`
IP: 212.227.19.131
Gesendete Zeichen: 23
Gesendete Nachricht: INVITE test SIP/2.0
Empfangene Zeichen: -1
Empfangene Nachricht:
Errno: 11
`
Die Nachricht wird korrekt gesendet, erhält aber keine Antwort (EAGAIN). Wenn ich recvfrom blocken lasse, blockt es bis in alle Ewigkeit. Ich vermute das ich irgendein Prinzip von UDP oder SIP nicht verstanden habe

Danke schonmal für jede Hilfe,
MfG JoneZ
-
Benutz doch nicht so was lowlevel mäßiges.
Boost hat asio als Socketimplementierung, ansonsten gibts in vielen Frameworks schon gute Klassen dafür (Qt oder wxWidgets z.b.).
-
phlox81 schrieb:
Benutz doch nicht so was lowlevel mäßiges.
Boost hat asio als Socketimplementierung, ansonsten gibts in vielen Frameworks schon gute Klassen dafür (Qt oder wxWidgets z.b.).Da ich eher an die Implementierung einer Serveranwendung für SIP dachte, ist die Nutzung von Frameworks nicht so sinnvoll. Nach deinem Vorschlag habe ich das ganze mit boost programmiert - jedoch mit demselben Ergebnis:
int iCheck=0; boost::asio::io_service io_service; udp::resolver resolver(io_service); udp::resolver::query query(udp::v4(), "sip.1und1.de", "5060"); udp::endpoint receiver_endpoint = *resolver.resolve(query); udp::socket socket(io_service); socket.open(udp::v4()); std::string sSend="INVITE test SIP/2.0\r\n\r\n"; iCheck = socket.send_to(boost::asio::buffer(sSend), receiver_endpoint); std::cout << "Sent bytes: " << iCheck << std::endl; udp::endpoint sender_endpoint; boost::array<char, 128> cRecv; socket.receive_from(boost::asio::buffer(cRecv), sender_endpoint); std::cout << cRecv.data() << std::endl;Ausgabe:
Sent bytes: 36Nach dieser Ausgabe blockt das Programm wieder auf ewig.
MfG JoneZ
-
dann guck halt mit nem sniffer nach was ein richtige client sendet
-
Habe das Problem gelöst:
Es lag doch am SIP-Request, der muss offenbar schon alle Header enthalten sonst gibts nicht mal ein Bad Request zurück.
Danke für alle Hilfe
MfG JoneZ