UDP-Protokoll

OUTDATED
Das Problem hat sich (von selbst) gelöst...



Also, ich habe ein kleines (eher großes) Problem:
Mein Programm soll auf einem Port (4300) einen Broadcast senden und dann antowrte auf den gleichen Port empfangen und dann interpretieren. Der Broadcast geht weg (kommt auch bei dem Test-Proggi an), aber nachdem ich den gleichen Socket bind-e und den blocking-Befehl receivefrom() aufrufe, kommt nicht an, auch wenn der Test-Programm sein packet vollständig versandt hatte. Ich weiß schon, dass es KEINE Garantie gibt, dass die einzelnen Packete ankommen, doch ein 100% Verlust ist schon verwunderlich, vor allem, weil es ohne dem Braodcast wurdevoll funktioniert hatte :(

Das Haupt-programm:
Code:
	//create all the needed stuff
	SOCKET receiver, sender, broadcaster;
	int broadcast=1;
	int ret=0;
	int size=0;
	char buffer[540];
	SOCKADDR_IN addr, rem_addr;
	memset(&rem_addr,0,sizeof(rem_addr));
	
	//creat the 3 sockets
	broadcaster=socket(AF_INET,SOCK_DGRAM,0);
	receiver=socket(AF_INET,SOCK_DGRAM,0);
	sender=socket(AF_INET,SOCK_DGRAM,0);
	if(receiver==INVALID_SOCKET||sender==INVALID_SOCKET||broadcaster==INVALID_SOCKET)
	{
		error("One of the sockets couldn't be initialised!! Terminating");
		error(WSAErr(WSAGetLastError()));
		goto end;
	}

	//set the sockopt for broadcast (is the error here????)
	if(setsockopt(broadcaster,SOL_SOCKET,SO_BROADCAST,(char *)&broadcast,sizeof(broadcast))==SOCKET_ERROR)
	{
		error("The broadcast-setting couldn't been initiated, revew your network settings or ask your administrator, terminating");
		error(WSAErr(WSAGetLastError()));
		goto end;
	}

	//get my own adress
	addr.sin_family=AF_INET;
	addr.sin_addr.S_un.S_addr=htonl(INADDR_BROADCAST);
	addr.sin_port=htons(S_PORT);

	gethostname(buffer,sizeof(buffer));
	hostent *me=gethostbyname(buffer);
	in_addr *ptr=(in_addr*)me->h_addr;
	sprintf(buffer,"hi#%s#%d",inet_ntoa(*ptr),ID);


	rem_addr.sin_family=AF_INET;
	rem_addr.sin_port=htons(S_PORT);
	rem_addr.sin_addr=*ptr;

	//send my broadcast!!
	int len=sendto(broadcaster,buffer,(int)strlen(buffer),0,(SOCKADDR*)&addr,sizeof(addr));
	if(len!=strlen(buffer))
	{
		error("Broadcast hello couldn't been send in one packet! Review your network settings (buffer size min 540)! Terminating");
	}
	closesocket(broadcaster);

	//bind the receiver socket
	addr.sin_addr=*ptr;
	if(bind(receiver,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR)
	{
		error("Couldn't bind socket to port/adress, look if it isn't in use and restart");
		error(WSAErr(WSAGetLastError()));
		goto end;
	}

	while(running)
	{
		size=sizeof(rem_addr);
		//blocking command, but it NEVER returns --> never gets a packet
		ret=recvfrom(receiver,buffer,sizeof(buffer)-1,0,(SOCKADDR*)&rem_addr,&size);
		if(ret==SOCKET_ERROR)
		{
			error("Couldn't receive from socket...");
			error(WSAErr(WSAGetLastError()));
			running=false;
			goto end;
		}
		buffer[ret]=0;

		WriteFile(pipe,buffer,(int)strlen(buffer),(LPDWORD)&size,NULL);
		if(size!=strlen(buffer))
			error("Couldn't write all data into buffer!! Expect errors!!");
		
		if(memcmp(buffer,"hi",2)==0)
		{
			sprintf(buffer,"me#%s#%d",inet_ntoa(*ptr),time(NULL));

			ret=sendto(sender,buffer,(int)strlen(buffer),0,(SOCKADDR*)&rem_addr,sizeof(rem_addr));
			if(ret==SOCKET_ERROR)
			{
				error("Couldn't send to socket...");
				error(WSAErr(WSAGetLastError()));
				running=false;
				goto end;
			}
		}
	}
	closesocket(receiver);
	closesocket(sender);

Der Code des Test-Proggies:
Code:
	WORD wVersionRequested;
	WSADATA wsaData;
	hostent *me;
	SOCKET sock, sender;
	SOCKADDR_IN myaddr;
	SOCKADDR_IN remoteaddr;
	int lenght=sizeof(remoteaddr);
	char buffer[540];
	int len=0;
	 
	wVersionRequested=MAKEWORD(2,2);
	 
	WSAStartup(wVersionRequested,&wsaData );


	myaddr.sin_family=AF_INET;
	myaddr.sin_port=htons(4300);

	gethostname(buffer,sizeof(buffer));
	me=gethostbyname(buffer);
	myaddr.sin_addr=*(in_addr*)me->h_addr;

	sock=socket(AF_INET,SOCK_DGRAM,0);
	sender=socket(AF_INET,SOCK_DGRAM,0);
	u_long noblock=1;
	bind(sock,(SOCKADDR*)&myaddr,sizeof(myaddr));

	while(1)
	{
	WORD wVersionRequested;
	WSADATA wsaData;
	hostent *me;
	SOCKET sock, sender;
	SOCKADDR_IN myaddr;
	SOCKADDR_IN remoteaddr;
	int lenght=sizeof(remoteaddr);
	char buffer[540];
	int len=0;
	 
	wVersionRequested=MAKEWORD(2,2);
	 
	WSAStartup(wVersionRequested,&wsaData );


	myaddr.sin_family=AF_INET;
	myaddr.sin_port=htons(4300);

	gethostname(buffer,sizeof(buffer));
	me=gethostbyname(buffer);
	myaddr.sin_addr=*(in_addr*)me->h_addr;

	sock=socket(AF_INET,SOCK_DGRAM,0);
	sender=socket(AF_INET,SOCK_DGRAM,0);
	u_long noblock=1;
	bind(sock,(SOCKADDR*)&myaddr,sizeof(myaddr));

	while(1)
	{
		//get the broadcast
		len=recvfrom(sock,buffer,sizeof(buffer)-1,0,(SOCKADDR*)&remoteaddr,&lenght);
		if(len==SOCKET_ERROR)
			printf("%s\n",err(WSAGetLastError()));
		buffer[len]=0;
		printf("%s has send %d bites, %s\n",inet_ntoa(remoteaddr.sin_addr),len,buffer);
		strcpy(buffer,"me#123.21.233.12#12342131241234");
		closesocket(sock);
		Sleep(5000);

		[color=red]//hier liegt der Hund (=Fehler) vergraben[/color]
		remoteaddr.sin_port=htons(4300);

		//send the answer to the broadcaster
		len=sendto(sender,buffer,strlen(buffer),0,(SOCKADDR*)&remoteaddr,sizeof(remoteaddr));
		if(len==SOCKET_ERROR)
			printf("%s\n",err(WSAGetLastError()));
	}

	return 0;

Na gut, ich hoffe all das genügt...
Wenn jemand im volständigen Code interessier ist, bitte pn an mich und ich schicke sie ihm.
Auch wenn es vielleicht so aussieht, DIES IST KEIN Trojaner, sondern der Dienst-Teil eines Serverlosen Chatsystems. Der Dienst versendet einen "Hi, I'm here" und die restlichen Chatproggies, die online sind, registrieren es und sendem ihm eine Antwort? la "Hi, Ich bin 123.123.123.1, meine ID ist 1234".
Hoffentlich weiß jemand ne Antwort drauf, weil ich habe jetzt ca. 1 Woche dran rumgetüftelt und habe keine Lösung gefunden (keine die mir wirklich taugt :( )
MfG
Mobius
 
Zurück
Oben