sendto() und recvfrom()



  • moins
    ich habe einen clienten, der zu einem udpsocket-server sendet bzw empfängt.
    ich will sone art chatprogramm schreiben. das problem ist, wenn der client auf die eingabe des nutzers wartet, kann er nicht vom server lauschen. bzw wenn er vom server lauscht, kann er nicht senden. es soll also die ganze zeit gelauscht werden, ob ne nachricht vom server kommt, und dabei aber auch die möglichkeit bestehen eine nachricht zu verschicken. wie mach ich das?
    ich hoffe ihr versteht was ich meine.
    gruß
    ebrosius

    edit: hab mir überlegt, das ich recvfrom() in einem thread nebenher laufen lasse. geht das so? gibts da noch was einfacheres?
    oder ich nehm 2 sockets, der eine lauscht der andere sendet???



  • Du kannst einen Socket schon so erstellen das er im Nicht blockierenden Modus
    arbeitet

    Hier das wurde an die Ufer des Internet per Google gespült
    im PDF sind soweit ich das überschaue was TCP/UDP betrifft alle Varianten dabei

    http://www2.fh-fulda.de/~gross/parallel.diplom/fol_k4.pdf



  • also ich hab das nu so probiert:

    UDPClient Cl(Port);
    
    	fd_set meinset;
    	std::string test="hallo";
    
    	while (Cl.iSock != -1)
    	{
    		std::cin.clear();
    
    		FD_ZERO(&meinset);
    		FD_SET(0,&meinset);
    		FD_SET(Cl.iSock,&meinset);
    
    		select(3, &meinset, NULL, NULL, /*&tv*/NULL);
    
    		if (FD_ISSET(0, &meinset))
    		{
    			Cl.UDPSend(test);
    			//std::cin.clear();
    		}
    		else
    		{
    			Cl.UDPReseive();
    			std::cout<<Cl.strRecMessage<<std::endl;	
    		}
    	}
    	return 0;
    }
    

    aber nun kommt bei meinem server zig mal "hallo" an. woran liegt das? und wie kann ich das was ich eingegeben hab ansprechen, um das in einen string zu packen für UDPSend(string)?
    gruß
    ebrosius



  • ok, so funzt es 🙂

    UDPClient Cl(Port);
    
    	fd_set meinset;
    	std::string test;
    
    	while (Cl.iSock != -1)
    	{
    		std::cin.clear();
    
    		FD_ZERO(&meinset);
    		FD_SET(0,&meinset);
    		FD_SET(Cl.iSock,&meinset);
    
    		select(Cl.iSock+1, &meinset, NULL, NULL, /*&tv*/NULL);
    
    		if (FD_ISSET(0, &meinset))
    		{
    			std::getline(std::cin,test);
    			Cl.UDPSend(test);
    			//std::cin.clear();
    		}
    		if (FD_ISSET(Cl.iSock, &meinset))
    		{
    			Cl.UDPReseive();
    			std::cout<<Cl.strRecMessage<<std::endl;	
    		}
    	}
    	return 0;
    }
    


  • UDP nimmt man doch nicht für einen Chat. 😃



  • hm, da war ich mir auch nich so sicher. aber hab mich für udp entschieden. sollen ja mehrere clients miteinander kommunizieren können. geht auf jedenfall auch so.
    meint ihr ich soll normale sockets nehmen? noch kann ich es schnell umproggn.
    die nachricht wird an den server geschickt, geparst und an den client den sie betrifft weitergeschickt. so dacht ich mir das.
    ok, das blöde is der server sieht nich wenn ein client off is 😃
    dann mach ich das wohl doch mit normalen sockets


Anmelden zum Antworten