UDP-Socket Problem Kommando mit Funktion verbinden...

Moin - ich habe ein Problem undzwar möchte ich gerne den Kommandostring
mit einer Funktion verbinden, sodass die Funktion xy(int,int) aufgerufen wird wenn der Kommandostring xy(10,20) kommt. Natürlich soll er auch die Parameter beachten.

Wäre cool, wenn jmd. eine Idee hätte :)

Mit freundlichen Grüßen
 
Ich würde sagen da musst du dir nen Parser programmieren.

Aber ein paar mehr Info's wären auch nciht schlecht, welche Sprache etc...
 
Ja, daran habe ich auch schon gedacht nur sind dann alles strings und er kommt dann irgendwie nicht damit kla... mein Prinzip war erstmal alles zerlegen... Funktionsname incl. Parametern und es dann mit ner switch auswählen jedoch ging das in die Hose^^....
 
Dann zeig uns doch mal, was du schon hast und nenne uns dein konkretes Problem, sonst können wir dir nicht helfen. ;)
 
Nagut, hier mal mein bisheriger Code...

Problematik: Wenn nun folgendes Kommando gesendet wird rechne(10,20) sollte er die Funktion mit den dazugehörigen parametern aufrufen...

Code:
 #include "StdAfx.h"
#include <winsock2.h>
#include <windows.h>
#include <string>
#pragma comment( lib, "ws2_32.lib" )

int rechne(int a, int b)
{
return a+b;
}


int startWinsock(void){WSADATA wsa;return WSAStartup(MAKEWORD(2,0),&wsa);}
DWORD WINAPI WinSockStartUPD(LPVOID param){
long rc=startWinsock();SOCKET s;char buf[256];SOCKADDR_IN remoteAddr,addr;
int remoteAddrLen=sizeof(SOCKADDR_IN);
s=socket(AF_INET,SOCK_DGRAM,0);
addr.sin_family=AF_INET;
addr.sin_port=htons(1234);
addr.sin_addr.s_addr=ADDR_ANY;
rc=bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
while(1)
{
rc=recvfrom(s,buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen);
if(!(rc==SOCKET_ERROR))
{
buf[rc]='0';
/*
Hier müsste der call hinkommen da in buf der Kommanda steht...

*/

}
}
return 0;
}


BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
HANDLE hThreadHandle = CreateThread(NULL,NULL,WinSockStartUPD,NULL,NULL,NULL);
break;

}
return TRUE;
}


So, nun habe ich auch nen Parser... er zerschneidet meinen Kommand nun in die einzelnen Teile... Funktionsname und die jeweiligen Parameter in jeweils einem char array...

Code:
char test[255][255];

void GetParam(char* test)
{
	int counter=0,merker=0;
	int laenge=0,count=0;char buffer[255];
	for(int i=0;*(test+i)!=NULL;i++){
		*(buffer+i) = *(test+i);
		if(*(test+i) == 40){*(buffer+i) = NULL;break;}
	}
	strcpy(Param[0], buffer);
	count++;laenge = 0;
	for(i=0;*(test+i)!=41;i++){
		if(((int)*(test+i) == 40)|| merker!=0)
		{
			*(test+counter) = *(test+i+1);
			counter++;merker=1;
		}
	}
	*(test+counter) = NULL;
	for(i=0;*(test+i)!=NULL;i++)
	{
		if(*(test+i) == 44 || *(test+i) == 41)
		{
			strcpy(Param[count], buffer);
			count++;
			laenge = 0;
		}else{
			buffer[laenge] =*(test+i);
			buffer[laenge+1] =NULL;
			laenge++;
		}
	}
}
Das Problem nun....wenn ich eine funktion callen möchte dessen Parameter DWORD (also long sind) bricht das Programm zusammen (char* habe ich einmal durch atol() geschickt damits nen long gibt...) was mache ich falsch?
 
Ich sehe in dem lesbaren Abschnitt deines Codes weder ein switch noch ein Parser.
Den unleserlichen unteren Code habe ich mir nicht angetan.
 
Lol, kA warum der so aus sa.. unten das soll mein Parser sein der schneidet schön alles aus... und naja weiter bin ich auch noch nicht da gehen mir die ideen aus da es ja nun alles strings sind und ich aber long brauche etc... daher Programm stürtzt dauernd ab.
 
Könntest du den Code komplett zusammenhängend mit Parser und Caller posten. Den Caller habe ich in dem unteren Codeabschnitt immernochnicht entdeckt.
 
Ja, das stimmt.... kleinen mom bitte ;)

EDIT: Hier, bitteschön :)

Code:
#include "StdAfx.h"
#include <winsock2.h>
#include <windows.h>
#include <string>
#pragma comment( lib, "ws2_32.lib" )
char Param[255][255];
//Prototyp
void GetParam(char*);
bool CheckString(char*, char*);
int rechne(int, int);

int startWinsock(void){WSADATA wsa;return WSAStartup(MAKEWORD(2,0),&wsa);}
DWORD WINAPI WinSockStartUPD(LPVOID param){
long rc=startWinsock();SOCKET s;char buf[256];SOCKADDR_IN remoteAddr,addr;
int remoteAddrLen=sizeof(SOCKADDR_IN);
s=socket(AF_INET,SOCK_DGRAM,0);
addr.sin_family=AF_INET;
addr.sin_port=htons(1234);
addr.sin_addr.s_addr=ADDR_ANY;
rc=bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
while(1)
{
rc=recvfrom(s,buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen);
if(!(rc==SOCKET_ERROR))
{
buf[rc]='0';
GetParam(buf);
//hier der Caller
if(CheckString(Param[0],"rechne")) rechne(atol(Param[1]),atol(Param[2]));

}
}
return 0;
}

BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
HANDLE hThreadHandle = CreateThread(NULL,NULL,WinSockStartUPD,NULL,NULL,NULL);
break;

}
return TRUE;
}

//Parser
void GetParam(char* test)
{
	int counter=0,merker=0;
	int laenge=0,count=0;char buffer[255];
	for(int i=0;*(test+i)!=NULL;i++){
		*(buffer+i) = *(test+i);
		if(*(test+i) == 40){*(buffer+i) = NULL;break;}
	}
	strcpy(Param[0], buffer);
	count++;laenge = 0;
	for(i=0;*(test+i)!=41;i++){
		if(((int)*(test+i) == 40)|| merker!=0)
		{
			*(test+counter) = *(test+i+1);
			counter++;merker=1;
		}
	}
	*(test+counter) = NULL;
	for(i=0;*(test+i)!=NULL;i++)
	{
		if(*(test+i) == 44 || *(test+i) == 41)
		{
			strcpy(Param[count], buffer);
			count++;
			laenge = 0;
		}else{
			buffer[laenge] =*(test+i);
			buffer[laenge+1] =NULL;
			laenge++;
		}
	}
}

bool CheckString(char* str1, char* str2){
	for(int i=0;*(str1+i)!=NULL || *(str2+i)!=NULL;i++) if(*(str1+i) !=*(str2+i)) return false;
	return true;
}

int rechne(int a, int b){return a+b;}
 
Hmm so ganz verstehe ich immernoch nicht was du da genau machst, aber so würde ich es machen:
Array mit den Befehlsnamen als char, und einem Pointer auf die jeweilige Prozedur/Funktion. Entweder als Array und UDTs oder eben als zweidimensionales. Ich würde UDT vorschlagen, der Flexibilität wegen.

Dann einfach Befehlsname rausfinden, und Funktion mit Parametern (deren Typen idealerweise im UDT in einem Array angegeben werden) aufrufen...
 
Okay... Nur wie meinst du das mit dem UDT Also was ein UDT st weiss ich ia jedoch weiss ich nicht wie ich dieses fuer mich sinnvoll nutzen soll... .das mit den pointer habe ich verstanden nur dann muessen alle funktionen die selben parametr habwn ansonsten muessen ja mehrere deklariert werden stimmts?
 
Eher so:
(Ich kann eig. kein C)
Code:
struct Parameter
{
 int iTyp; // Für iTyp Konstanten wie 1=Char, 2=Int etc. definieren
 SIZE_T iSize;
 void* pInhalt;
}

struct Funktion
{
 int iParameter; // Anzahl der Parameter
 Parameter* pParams[32];
 void* pFunktion; // Zeiger auf die Funktion
}
 
benutz für so etwas am besten eine skriptsprache (ruby is ganz gut), denn dort ist sowas eie zeile.

in echten programmeirsprachen wirste um die array lösung nich drumrumkommen, und das is von der tipparbeit her ähnlich wie ein switch case.
 
Zurück
Oben