UDP Pakete von neuem Thread aus senden



  • Guten Morgen

    Ich habe ein kleines Programm welches mir UDP Pakete an ein eingegebenes Ziel sendet.

    Das funktioniert auch doch wenn ich diese Funktion jedoch mit einem anderen Thread aufrufe, bekomme ich den Error "WSAEACCES: 10013" welche mir sagen soll dass die "Berechtigung verweigert wurde".

    Den Thread erstelle ich so:

    Klasse^ w = gcnew Klasse;
    Thread^	neuerThread = gcnew Thread(gcnew ThreadStart(w, &Klasse::funktion));
    

    Die Funktion die Sockets erstellt und Pakete sendet sieht so aus:

    static bool sendingStuff(String^ ssProt, String^ ssMsg, String^ ssPort, String^ ssTarget, bool isSending) 
    		{		
    
                SOCKET			sock;
    			WSADATA			wsData;
    			sockaddr_in		addr;
    			int				wsa_startup, prot;
    			int				send;
    			int				port = int::Parse(ssPort); //Zielport
    			const char*		cTarget = strdup(marshal_as<std::string>(ssTarget).c_str()); //Zieladresse
    			const char*		msg_out = strdup(marshal_as<std::string>(ssMsg).c_str());	//Nachricht die gesendet wird
    
    			if (isSending) {
    
    				if (ssProt == "UDP") {
    					prot = 2;
    				}
    				else if (ssProt == "TCP") {
    					prot = 1;
    				}
    
    				//Sockets erstellen
    				ZeroMemory(&wsData, sizeof(wsData));
    				wsa_startup = WSAStartup(MAKEWORD(2, 2), &wsData);
    				sock  = socket(AF_INET, prot, 0);
    
    				//Zieladresse und Port festlegen
    				ZeroMemory(&addr, sizeof(addr));
    				addr.sin_family = AF_INET;
    				addr.sin_port = htons(port);
    				addr.sin_addr.s_addr = inet_addr(cTarget);
    
    				//Senden
    				while (isSending) {
    					send = sendto(sock, msg_out, 0x800, 0, (sockaddr *)&addr, sizeof(sockaddr_in));
    
    					if (send <= 0) {
    						MessageBox::Show("Fehlercode: " + WSAGetLastError(), "Socket-Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
    						closesocket(wsa_startup);
    						closesocket(sock);
    						isSending = false;
    						return false;
    					}
    				}
    			}
    			else {
    				closesocket(wsa_startup);
    				closesocket(sock);
    				return false;
    		        }
    		}
    

    Wie gesagt es funktioniert eigentlich aber von einem anderen Thread aus bekomme ich die oben genannte Fehlermeldung.
    Hat jemand einen Anstoß?
    Danke im Vorraus.



  • 1. Ich rate Dir dringend von C++/CLI ab, ausser Du hast einen guten Grund dafür. Der einzige gute Grund ist, die native und die managed (=.NET) Welt miteinander zu verbinden.
    2. Falls es doch C++/CLI sein muss, dann rate ich Dir, die Netzwerkfunktionalität von .NET anstatt die native Socket API zu nutzen. Siehe zum Beispiel https://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.aspx
    3. Der mit strdup(..) kopierte String muss mit free(..) freigegeben werden, sobald dieser nicht mehr in Gebrauch ist, sonst resultiert ein Memory-Leak. Besser benutzt Du std::string und rufst ggf. c_str() bei der Übergabe an eine Funktion auf.
    4. Beim Aufruf von socket(..) ist meiner Meinung nach das 3. Argumente nicht korrekt. Siehe https://msdn.microsoft.com/en-us/library/windows/desktop/ms740506.aspx. Es sollte wohl socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); heissen (das 2. Argument entspricht immerhin dem richtigen Wert, aber das 3. Argument passt gar nicht).


Log in to reply