Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

UDP-Protokoll

Diskussion: UDP-Protokoll im Forum Code Kitchen, in der Kategorie Software Home; Anzeige OUTDATED Das Problem hat sich (von selbst) gelöst... Also, ich habe ein kleines (eher großes) Problem: Mein Programm soll ...

Antwort
Alt 30.09.04, 16:33   #1 (permalink)
 
Registriert seit: 09.06.04
Mobius Leistung: Facit NTK
Likes: 0
Standard UDP-Protokoll

Anzeige

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);

		//hier liegt der Hund (=Fehler) vergraben
		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
Mobius ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » UDP-Protokoll
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Das ICQ PRotokoll OSCAR MindCode Code Kitchen 8 30.12.07 10:55
firefox+protokoll tanj Applikationen 1 15.06.07 23:42
IPX-Protokoll Ubuntu weau Linux/UNIX 6 13.06.07 16:22
Icq Protokoll -- Nachrichten Xalon (In)security allgemein 3 24.04.07 18:24
TCP Protokoll wanksta2003 Network · LAN, WAN, Firewalls 2 31.10.03 16:20


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61