MySQL UDF WSAStartup

luigied

Mitglied
Hi Leute,

ich versuche zur ZEit eine User defined Function (UDF) für MySQL zu erstellen, mit der ich UDP-NAchrichten verschicken kann.

Meine UDPSend_init-Function enthält:
Code:
WSADATA wsaData;
int start = WSAStartup(MAKEWORD(2,2), &wsaData);
if (start != 0){
        memcpy(message, "WSAStartup failed\0", 80);
	return 1;
}
...

Linker und Compiler laufen problemlos durch. Auch kann ich die Funktion im MySQL-Server installieren.
Wenn ich sie dann allerdings aufrufe bekomme ich volgenden Fehler.
Can't initialize function 'UDPSend';

Da er mir keine weitere Meldung ausgibt, scheint es schon vor dem if, also theoretisch beim WSAStartup zu "knallen".

Ich habe irgendwo gelesen, dass bei Win7 die WinSock-Api irgendwie fehlerhaft wäre. Kann es daran liegen?

mfg LuigiEd
 
Hi

das Codestück ist also der Anfang von UDPSend?
Wenn eine Meldung wie "can not initialize" ausgegeben wird, geht aber schon vor WSAStartup was daneben.
Also kein Socketproblem. Der Fehler muss wo anders liegen.

Zur fehlerhaften 7-Api: Die Winapi ist riesig...mich würde es wundern, wenn keine Fehler drin wären.
Sind eben auch "nur unperfekte Menschen", die das machen.
Da Das Problem aber ziemlich sicher nicht WSAStartup ist, hat es keinen Sinn, den Sockets die Schuld zu geben.

Gruß
 
Lol. hat sich rausgestellt, dass der Code doch richtig war und erst am Ende der Funktion gekracht hat, weil ich return true stehen hatte, und das in dem fall auf einen Fehler hinweist, Bei return 0 hat es dann geklappt.

ICh kann die Funktion jetzt problemlos ausführen in mysql. bringt keinen fehler. Allerdings empfängt meine "Gegenstelle", welche ich in vb .net geschrieben hatte auch nix. Theoretisch wird aber das datagram gesendet. Selbst die sndto-Funktion liefert keinen fehler zurück.

Die Gegenstelle funktioniert auch soweit, da ich die schon mit einer Erweiterung für MSSQL-Server getestet habe.

Sie empfängt aber einfach keine Daten. *grübel* Muss ich da noch irgendwas in MySQL einstellen?

mfg
 
Leider hast du zu wenig von deinen funktionen gepostet, als dass man sich ein komplettes Bild darüber machen könnte wos knallt.

beachte, dass wenn const_item != 0 ist, das ergebniss der worker funktion cacheable ist, und die worker funktion daher unter umständen nicht mehrfach aufgerufen wird.

Auch würd ich dir empfehlen dein MySQL error log im auge zu behalten. Oftmals ist der grund warum eine UDF nicht funktioniert in der tatsache zu finden, dass der mysqld dadurch crasht.
 
Das hier sind die 3 Funktionen, die von MySQL benötigt werden:

Code:
long long UDPSend(UDF_INIT *initid, UDF_ARGS *args,
	char *is_null, char *error);
my_bool UDPSend_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
void UDPSend_deinit(UDF_INIT *initid);

SOCKET sock;
unsigned long ip;
sockaddr_in addr;

long long UDPSend(UDF_INIT *initid, UDF_ARGS *args,
	char *is_null, char *error){
		sockaddr out_addr;
		memcpy((sockaddr*)&out_addr, &addr, sizeof(addr));
		int result = sendto(sock, args->args[2], sizeof(args->args[2]), 0, &out_addr, sizeof(addr));
		if (result < 0){
			//error= "Testfehler";
			return 1;
		}
		return 0;
}
	
my_bool UDPSend_init(UDF_INIT *initid, UDF_ARGS *args, char *message){
	
	WSADATA wsaData;
	int start = WSAStartup(MAKEWORD(2,2), &wsaData);
	if( start < 0){
		memcpy(message, "WSAStartup ist fehlgeschlagen\0", 29);
		return 1;
	}
	sock = socket(AF_INET, SOCK_DGRAM, 0);
	memset(&addr, 0, sizeof(addr));
	if( sock < 0){
		memcpy(message, "Socket nicht initialisiert\0", 26);
		return 1;
	}
	ip = inet_addr( args->args[0] );
	memcpy( (char *)&addr.sin_addr, &ip, sizeof(ip));
	
	addr.sin_family = AF_INET;
	addr.sin_port = htonl((long int)args->args[1]);
	
	return 0;
}
	
void UDPSend_deinit(UDF_INIT *initid){
	closesocket(sock);
	WSACleanup();
}

Die kompilierte DLL wird in MySQL mit

Code:
CREATE FUNCTION 'UDPSEND' SONAME 'CExternalProc.dll';

eingebunden.
 
Zurück