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 mitstrdup(..)
kopierte String muss mitfree(..)
freigegeben werden, sobald dieser nicht mehr in Gebrauch ist, sonst resultiert ein Memory-Leak. Besser benutzt Dustd::string
und rufst ggf.c_str()
bei der Übergabe an eine Funktion auf.
4. Beim Aufruf vonsocket(..)
ist meiner Meinung nach das 3. Argumente nicht korrekt. Siehe https://msdn.microsoft.com/en-us/library/windows/desktop/ms740506.aspx. Es sollte wohlsocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
heissen (das 2. Argument entspricht immerhin dem richtigen Wert, aber das 3. Argument passt gar nicht).