UDP Broadcast Problem

  • Themenstarter Themenstarter inti
  • Beginndatum Beginndatum
I

inti

Hallöle ihr Freaks, ich habe ein kleines (großes) Problemchen :

Es geht darum, mit einer einfachen Konsolenanwendung einen UDP Broadcast zu senden, die einkommenden Informationen aufzuarbeiten und diese dann aufzulisten.

Das Ganze soll dazu dienen, das lokale Netz nach einem best. Kameratyp (Industriegerät) abzusuchen und deren ID sowie aktuelle IP auszulesen, um diese später spezifisch konfigurieren zu können (per TCP Verbindung).

Ich selber habe dafür ein einfaches Prog. als Vorlage bekommen, was ich zunächst versuchen sollte zu verstehen und dann zu zerpflücken, um einzelne Bausteine zu verwenden.

Prob ist, ich habe bis letzte Woche, als ich damit angefangen habe noch nie was mit C++ (MSoft Visual C++ 6) zu tun gehabt und auch sonst nur wenig Programmierskills, so dass ich mir immer noch nicht alle Codeteile restlos erklären kann .. aber trotzdem macht das Tool schon fast das was es soll..

Mein eigentliches Problem ist jetz, dass das Prog zwar , aber relativ unzuverlässig ist, bei 2 Kameras bekomme ich z.B. auch abundzu mal nur Antwort (oder gar keine), auch wenn ich nur 1 Kamera im Netz habe erhalte ich gelegentlich mal keine Antwort..

Die Erfolgsrate liegt so bei ca 60-70%

Wie kann ich, auf möglichst einfachem Weg eine Fehlerkorrektur einbauen ?
Wenn ich weitere Abfrageschleifen ins Prog einbaue, erhalte ich immer nur beim ersten Versuch eine Antwort, ich vermute also ich muss dafür irgendwas zurücksetzen..

und so siehts atm aus :
Code:
// konsolentest.cpp
//

#include "stdafx.h"

int main(int argc, char* argv[])
{
	char buf[29];
	char buffo[30];
	char ip[40];
	char ausgabe[400];

	int timeout;

	SOCKET UDP_BC_Socket;
	// SOCKET TCP_CTL_Socket;

	struct sockaddr_in UDP_BC;
	UDP_BC.sin_family=AF_INET;
	UDP_BC.sin_port=htons(2222);
	UDP_BC.sin_addr.s_addr=htonl(INADDR_BROADCAST);
	memset(&(UDP_BC.sin_zero), '/0', 8);
	
	struct sockaddr_in client;
	client.sin_family=AF_INET;
	client.sin_port=htons(5432);
//	client.sin_addr.s_addr=	inet_addr("192.168.2.1"); //eigene ip
	memset(&(client.sin_zero), '/0', 8);
	
	clock_t zeit,ziel;
		
	WORD wVersionRequested;
	WSADATA wsaData;
	int	 err;
 	wVersionRequested = MAKEWORD( 2, 2 );
 	err = WSAStartup( wVersionRequested, &wsaData );

	unsigned long pdaten;

	int  addr_len, numbytes, bytes, nonblock =1, on=1;
	
	addr_len=sizeof sockaddr;
	
	bool fBroadcast = TRUE;
	
	char steuersend[130];
	sprintf(buf,"on");
	
	if (argc>1) timeout=atoi(argv[1]);
	if (timeout==0 || timeout<100 || timeout>10000)
	{
		printf("Keiner oder ung\x81ltiger Timeoutparameter angegeben !\nBitte Timeout in Millisekunden angeben (min 100, max 10000) : ");
		scanf("%d",&timeout);
	
		if (timeout<100 || timeout>10000) {printf("\nFehlerhafte Eingabe, Standart (1 sec) wird verwendet\n");timeout=1000;};
	};
	
	if( (UDP_BC_Socket = socket(AF_INET, SOCK_DGRAM, 0)) == -1 )	// --> Netzwerk bzw. Winsock Fehlerabfragen
	{
		int error = WSAGetLastError ();
		printf("Fehler bei Erstellung des Sockets\tFehlernummer : %d\n",error);
	}

	if (setsockopt(UDP_BC_Socket, SOL_SOCKET, SO_BROADCAST, (CHAR *) &fBroadcast, sizeof ( BOOL )) != 0)
	printf("\nFehler bei BROADCAST SERVER\n");
	
	if (ioctlsocket(UDP_BC_Socket, FIONBIO, (u_long FAR *) &nonblock) == -1)
	{	printf("Fehler bei NONBLOCKING SERVER\n");};
	
	printf("\nScan l\x84uft\n\n");

		
	numbytes= sendto(UDP_BC_Socket,"bLa",4,0,(struct sockaddr*) &UDP_BC, sizeof (struct sockaddr)); // --> UDP Rundruf
	buf[0]= '\0';
		
		zeit=(clock_t)timeout * CLOCKS_PER_SEC/1000;
		ziel=zeit+clock();
		while (ziel > clock());
		
			bytes= recvfrom(UDP_BC_Socket,buf,8,0,(struct sockaddr*) &UDP_BC, &addr_len);
		//	ioctlsocket(UDP_BC_Socket, FIONREAD, &pdaten); // --> Überprüfung, ob gepufferte Daten (bei mehrerern Kameras) vorhanden sind
		//	printf("Gepufferte Bytes : %d\n",pdaten);

			if (bytes!=-1)
			{
				while (bytes!=-1)
				{
					buf[8]='\0';											// --> Formatierung Kamera ID
					sprintf(ausgabe,"Kamera-ID: %s @ %d.%d.%d.%d\n",buf,	// --> Ausgabe ID und IP
					(unsigned char)(UDP_BC.sin_addr.s_addr),
					(unsigned char)(UDP_BC.sin_addr.s_addr >> 8),
					(unsigned char)(UDP_BC.sin_addr.s_addr >> 16),
					(unsigned char)(UDP_BC.sin_addr.s_addr >> 24));
					ip[20]='\0';
					printf(ausgabe,"\n");
					bytes= recvfrom(UDP_BC_Socket,buf,8,0,(struct sockaddr*) &UDP_BC, &addr_len); // --> Abfrage weiterer Daten
				}
			}
			else 
			{
				printf("Keine Kamera gefunden oder Verbindungsproblem\n");
				printf("Hinweis : Vor Ausf\x81hrung  Kamera(s) einschalten und Netzwerkverbindung herstellen \n\nDer Initialisierungsvorgang der Kameras dauert ca 30 Sekunden\n\n");
	}

	printf("\nTransfer beendet !\n");	
/*	steuersend[0]=0x52;
	steuersend[1]=0x45;
	steuersend[2]=0x53;
	steuersend[3]=0x45;
	steuersend[4]=0x54;
	send(TCP_CTL_Socket,(char*) steuersend,5,0);
*/
	closesocket(UDP_BC_Socket);
//	closesocket(TCP_CTL_Socket);

	printf("Tastendruck beendet die Verbindung !\n");
	getch();
	return 0;
}

stdafx.h siehts so aus :

Code:
#if !defined(AFX_STDAFX_H__025B847A_1C81_48CA_953F_E73FBC76A764__INCLUDED_)
#define AFX_STDAFX_H__025B847A_1C81_48CA_953F_E73FBC76A764__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define WIN32_LEAN_AND_MEAN		// Selten benutzte Teile der Windows-Header nicht einbinden

#include <stdio.h>
#include <afxsock.h>
#include <conio.h>

Bin für jegliche Hinweise und Hilfe dankbar ...
 
Ich schätze mal, da musst du in die RFC vom UDP Protokoll nachschauen. Such bei Google mal nach ner Liste der ganzen RFC's.
 
Zurück