MySQL UDF netzwerk

luigied

Mitglied
Hi,

ich versuche gerade eine user defined function für MySQL zu schreiben, welche mir eine UDP-NAchricht an eine bestimmte IP und Port sendet.

Beim Ausführen der Funktion über die MySQL-Kommandozeile bekomme ich keinen Fehler.
Allerdings habe ich per Paketsniffer (lokal) festgestellt, dass kein UDP-Paket erzeugt wird

Hier der Code:
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();
}

Stimmt es, dass ich diese UDFs nur in C/C++ schreiben kann? Die MySQL-Referenz sprach von, mit C kompatiblen Sprachen.

Danke im Vorraus.

LuigiEd
 
Ok, habe noch etwas herausgefunden.
Ich habe die UDPSend-Funktion so modifiziert, dass der Rückgabewert von sendto zurückgegeben wird.

Die sendto-Funktion liefert scheinbar unabhängig davon, was ich als Nutzdaten mitsenden will, immer 8 zurück, also dass 8 bit übertragen wurden. (kleinster möglicher Wert). Das heisst, dass dieser Parameter komischerweise ignoriert wird.

Die Funktion wird bei einem Aufruf aber scheinbar ordnungsgemäß ausgeführt, da ich, wenn ich eine ungültige IP-Adresse angebe, z.B. 300.0.0.1, die entsprechende Fehlerausgabe (-1) bekomme.

Sehr seltsam. Hat denn keiner von euch eine Idee, woran das liegen könnte?

mfg LuigiEd
 
Ok, Ich habe das Ganze jetzt mal nach TCP portiert. Beim connect() bekomme ich einen WSAETIMEDOUT-Fehler (10061).
Ach ja, den bekomme ich auch, nachdem ich den Client, der das empfangen soll gestartet habe. ;)

Könnte eventuell ein Netzwerk- oder Sicherheits-Problem sein.

Kann mir da irgendjemand einen Tipp geben?
 
Zurück