2 threads in c++ starten, die socketverbidung herstellen
-
Morgen,
ich habe da ein Problem beim erstellen einer Socketverbindung durch 2 Threads.
int main(){ SenderEmpfaenger *se = new SenderEmpfaenger(); _beginthread(&writeThread, 0, (void*)12); _beginthread(&sendThread, 0, (void*)12); }hier bei den threads komme ich net weiter, da ich write- bzw. sendMessage net rein krieg
void __cdecl writeThread(void *) { //hier soll writeMessage aufgerufen werden } void __cdecl sendThread(void *) { //hier soll sendMessage aufgerufen werden }hier ist noch der code der beiden aufzurufenden Methoden
void SenderEmpfaenger::sendMessage(string a){ int bytes; bytes = send(this->Sendersocket, a.c_str(), strlen(a.c_str()), 0); if (bytes == -1) { perror("send() in sendMessage() failed"); } } void SenderEmpfaenger::writeMessage(){ printf("Banner is \"%s\"\n", this->getNextMessage()); }meine frage würde das mit den threads so gehen und wie krieg ich send- und writeMessage?
ich habs gerade auch mal so durchlaufen lassen, da kam:
1>------ Erstellen gestartet: Projekt: Sender und Empaenger, Konfiguration: Debug Win32 ------
1>Verknüpfen...
1>SenderEmpfaenger.obj : error LNK2028: Nicht aufgelöstes Token (0A000280) ""extern "C" unsigned long __stdcall inet_addr(char const *)" (?inet_addr@@$$J14YGKPBD@Z)", auf das in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$FQAE@XZ)" verwiesen wird.
1>SenderEmpfaenger.obj : error LNK2028: Nicht aufgelöstes Token (0A00028D) ""extern "C" unsigned short __stdcall htons(unsigned short)" (?htons@@$$J14YGGG@Z)", auf das in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$FQAE@XZ)" verwiesen wird.
1>SenderEmpfaenger.obj : error LNK2028: Nicht aufgelöstes Token (0A0002AB) ""extern "C" int __stdcall recv(unsigned int,char *,int,int)" (?recv@@$$J216YGHIPADHH@Z)", auf das in Funktion ""private: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall SenderEmpfaenger::getNextMessage(void)" (?getNextMessage@SenderEmpfaenger@@$$FAAE?AV?char_traits@D@std@@V?allocator@D@2@@std@@XZ)" verwiesen wird. 1>SenderEmpfaenger.obj : error LNK2028: Nicht aufgelöstes Token (0A0002AD) ""extern "C" int \_\_stdcall bind(unsigned int,struct sockaddr const *,int)" (?bind@@FQAE@XZ)" verwiesen wird. 1>SenderEmpfaenger.obj : error LNK2028: Nicht aufgelöstes Token (0A0002B2) ""extern "C" unsigned int \_\_stdcall socket(int,int,int)" (?socket@@FQAE@XZ)" verwiesen wird. 1>SenderEmpfaenger.obj : error LNK2028: Nicht aufgelöstes Token (0A0002D8) ""extern "C" int \_\_stdcall send(unsigned int,char const *,int,int)" (?send@@basic_string@DU?allocator@D@2@@std@@@Z)" verwiesen wird.
1>SenderEmpfaenger.obj : error LNK2028: Nicht aufgelöstes Token (0A0002EC) ""extern "C" int __stdcall listen(unsigned int,int)" (?listen@@$$J18YGHIH@Z)", auf das in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$FQAE@XZ)" verwiesen wird.
1>SenderEmpfaenger.obj : error LNK2028: Nicht aufgelöstes Token (0A000323) ""extern "C" unsigned int __stdcall accept(unsigned int,struct sockaddr *,int *)" (?accept@@$$J212YGIIPAUsockaddr@@PAH@Z)", auf das in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$FQAE@XZ)" verwiesen wird.
1>SenderEmpfaenger.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall send(unsigned int,char const *,int,int)" (?send@@$$J216YGHIPBDHH@Z)" in Funktion ""public: void __thiscall SenderEmpfaenger::sendMessage(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?sendMessage@SenderEmpfaenger@@$$FQAEXV?char_traits@D@std@@V?allocator@D@2@@std@@@Z)". 1>SenderEmpfaenger.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned int \_\_stdcall accept(unsigned int,struct sockaddr *,int *)" (?accept@@FQAE@XZ)". 1>SenderEmpfaenger.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int \_\_stdcall listen(unsigned int,int)" (?listen@@FQAE@XZ)". 1>SenderEmpfaenger.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int \_\_stdcall bind(unsigned int,struct sockaddr const *,int)" (?bind@@FQAE@XZ)". 1>SenderEmpfaenger.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned short \_\_stdcall htons(unsigned short)" (?htons@@FQAE@XZ)". 1>SenderEmpfaenger.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned long \_\_stdcall inet\_addr(char const *)" (?inet\_addr@@FQAE@XZ)". 1>SenderEmpfaenger.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned int \_\_stdcall socket(int,int,int)" (?socket@@FQAE@XZ)". 1>SenderEmpfaenger.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int \_\_stdcall recv(unsigned int,char *,int,int)" (?recv@@basic_string@DU?allocator@D@2@@std@@XZ)".
1>Z:\workspace 2\Sender und Empaenger\Debug\Sender und Empaenger.exe : fatal error LNK1120: 16 nicht aufgelöste externe Verweise.
1>Das Buildprotokoll wurde unter "file://z:\workspace 2\Sender und Empaenger\Sender und Empaenger\Debug\BuildLog.htm" gespeichert.
1>Sender und Empaenger - 17 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Schon mal danke für alle hilfe.
Grüße Ischterai
-
Schau dir evtl. mal boost::threads an, das macht die Bentuzung von Threads duetlich plattformunabhängiger und auch leichter.
Mit dem was du hast müsstest du den beiden Threads vermutlich einen Pointer auf dein Objekt übergeben (statt der gecasteten 12, ich frag mich grad wozu die gut sein soll), damit du dessen Methoden aufrufen kannst..
-
boost::thread hab ich schon gelesen, ist aber net so tool wenn man in visual c++ 2005 programmieren muss. Die 12 ist sinlos, hab ich gerade gemerkt, muss NULL hin.
-
Wo ist das Problem mit boost::thread in VS? Ich benutze es in VS 2003 bis 2008 und verstehe nicht, was daran nicht toll sein sollte.
Du musst mit Zeigern zwar etwas aufpassen und wo du deinen Text später herholst, musst du selbst wissen, aber grundsätzlich sollte folgendes funktionieren:
#include <boost/thread/thread.hpp> #include <boost/thread/mutex.hpp> boost::mutex io_mutex; class Sender { SenderEmpfaenger *se; public: Sender(SenderEmpfaenger *_se) : se(_se) {} void operator()() { boost::mutex::scoped_lock lock(io_mutex); se->sendMessage("Nachricht"); } }; int main() { SenderEmpfaenger *se = new SenderEmpfaenger(); boost::thread t(sender(se)); t.join(); delete se; }Greetz
-
Ischterai schrieb:
boost::thread hab ich schon gelesen, ist aber net so tool wenn man in visual c++ 2005 programmieren muss.
Was hat das mit VS2005 zu tun? Ich habe mit
boost::threadin VS2005 ohne Probleme programmiert. Wo soll das "nicht so toll" sein?Zu deinem Problem:
Du musst einen Zeiger auf das entsprechende Objekt übergeben, auf welchemwriteMessageundsendMessageaufgerufen werden sollen. Am besten übergibst du den Zeiger alsvoidZeiger und castest dann zurück. Allerdings gehört dies wohl eher in die WinAPI._beginthreadhat nichts mit Standard C++ zu tun.Zu deinen Fehlern:
Erst recht ins WinAPI Forum. Du hast vergessen die richtige Bibliothek zu linken, nämlich die Winsock Bibliothek (Ws2_32.lib).Grüssli