UDP Broadcast, ausgehender Port



  • Hi,

    ich versuche einen Broadcast über den Port 67 (UDP)
    zu versenden und der Empfänger soll den Broadcast auf dem Port 68 empfangen...

    Leider hab ich keine Ahnung wie ich den Port festlege, von dem das packet verschickt werden soll...
    Eigentlich dachte ich, dass ich das mit bind() mache, wenn ich den untenstehenden code ausführe, dann nimmt er sich aber irgendeinen freien...

    if(g_iSetNewIp) 
    	{
    		int ip1,ip2,ip3,ip4;
    		SOCKET SendSocket=0;
    		sockaddr_in RecvAddr, srv;
    		T_Answer_Package Answer;
    		int optval = 1;
    		unsigned int optlen = sizeof(optval);
    
    		if((SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
    			cout<<"Socket failed"<<endl;
    
    		srv.sin_addr.s_addr = INADDR_ANY;
    		srv.sin_port = htons(67);
    		srv.sin_family = AF_INET;
    
    		RecvAddr.sin_family = AF_INET;
    		RecvAddr.sin_port = htons(68);
    		RecvAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    		int DEBUGbind = bind(SendSocket,(sockaddr *)&srv, sizeof(srv));
    		int DEBUGsetsockopt = setsockopt(SendSocket,SOL_SOCKET,SO_BROADCAST,(char *)&optval,optlen);
    
    		//new Camera-IP
    		sscanf(newip,"%d.%d.%d.%d",&ip1,&ip2,&ip3,&ip4);
    
    		//prepairing answerpackage
    		Answer.magic=0x72432167;
    
    		for(int i=0; i<25; i++)
    			Answer.nouse[i]= '0';
    
    		Answer.snr[0]=_ptBc->snr[0];
    		Answer.snr[1]=_ptBc->snr[1];
    		Answer.snr[2]=_ptBc->snr[2];
    		Answer.snr[3]=_ptBc->snr[3];
    
    		for(int i=0; i<36; i++)
    			Answer.nouse2[i]= '0';
    
    		Answer.mac[0]=_ptBc->mac[0];
    		Answer.mac[1]=_ptBc->mac[1];
    		Answer.mac[2]=_ptBc->mac[2];
    		Answer.mac[3]=_ptBc->mac[3];
    		Answer.mac[4]=_ptBc->mac[4];
    		Answer.mac[5]=_ptBc->mac[5];
    
    		Answer.ip[0]=(unsigned char) ip1;
    		Answer.ip[1]=(unsigned char) ip2;
    		Answer.ip[2]=(unsigned char) ip3;
    		Answer.ip[3]=(unsigned char) ip4;
    
    		Answer.mask[0] = _ptBc->mask[0];
    		Answer.mask[1] = _ptBc->mask[1];
    		Answer.mask[2] = _ptBc->mask[2];
    		Answer.mask[3] = _ptBc->mask[3];
    
    		Answer.gate[0] = _ptBc->gate[0];
    		Answer.gate[1] = _ptBc->gate[1];
    		Answer.gate[2] = _ptBc->gate[2];
    		Answer.gate[3] = _ptBc->gate[3];
    
    		Answer.dhcp[0] = _ptBc->dhcp[0];
    		Answer.dhcp[1] = _ptBc->dhcp[1];
    		Answer.dhcp[2] = _ptBc->dhcp[2];
    		Answer.dhcp[3] = _ptBc->dhcp[3];
    
    		Answer.autoexec[0] = 0x00;
    		Answer.autoexec[1] = 0x00;
    		Answer.autoexec[2] = 0x00;
    		Answer.autoexec[3] = 0x01;
    
    		// dummy-package
    		char dummy[10] = "DUMMY";
    
    		int DEBUGsendtodummy=sendto(SendSocket,dummy,0,0,(SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
    		if (DEBUGsendtodummy==-1)
    			cout<<"DEBUG send2dummy error"<<endl;
    		int DEBUGsendto=sendto(SendSocket,(char *) &Answer,sizeof(T_Answer_Package), 0,(SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
    		if (DEBUGsendto==-1)
    			cout<<"DEBUG sendTo error "<<sizeof(T_Answer_Package)<<endl;
    		int DEBUGclose=closesocket(SendSocket);
    		cout<<"DEBUGclose "<<DEBUGclose<<endl;
    
    		g_iSetNewIp=false;
    

    _ptBc ist ne ähnliche struktur wie Answer, hoffe diese info ist für meine frage nicht wichtig...

    Danke im vorraus



  • Warum ist es für dich wichtig zu Wissen von welchem Port die Nachricht kommt? Sende lieber ein eindeutigen Protokoll-Header.
    Es ist übrigens nicht sehr klug eine Struktur unverändert zu versenden. Padding, Alignment, Größe von Datentypen, müssen bei Sender und Empfänger nicht gleich sein.


Anmelden zum Antworten