Ischterai Geschrieben 2. April 2009 Geschrieben 2. April 2009 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?$basic_string@DU?$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@@$$J212YGHIPBUsockaddr@@H@Z)", auf das in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$FQAE@XZ)" verwiesen wird. 1>SenderEmpfaenger.obj : error LNK2028: Nicht aufgelöstes Token (0A0002B2) ""extern "C" unsigned int __stdcall socket(int,int,int)" (?socket@@$$J212YGIHHH@Z)", auf das in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$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@@$$J216YGHIPBDHH@Z)", auf das in Funktion ""public: void __thiscall SenderEmpfaenger::sendMessage(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?sendMessage@SenderEmpfaenger@@$$FQAEXV?$basic_string@DU?$char_traits@D@std@@V?$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?$basic_string@DU?$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@@$$J212YGIIPAUsockaddr@@PAH@Z)" in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$FQAE@XZ)". 1>SenderEmpfaenger.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall listen(unsigned int,int)" (?listen@@$$J18YGHIH@Z)" in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$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@@$$J212YGHIPBUsockaddr@@H@Z)" in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$FQAE@XZ)". 1>SenderEmpfaenger.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned short __stdcall htons(unsigned short)" (?htons@@$$J14YGGG@Z)" in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$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@@$$J14YGKPBD@Z)" in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$FQAE@XZ)". 1>SenderEmpfaenger.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned int __stdcall socket(int,int,int)" (?socket@@$$J212YGIHHH@Z)" in Funktion ""public: __thiscall SenderEmpfaenger::SenderEmpfaenger(void)" (??0SenderEmpfaenger@@$$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@@$$J216YGHIPADHH@Z)" 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?$basic_string@DU?$char_traits@D@std@@V?$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 Zitieren
Klotzkopp Geschrieben 2. April 2009 Geschrieben 2. April 2009 sendMessage und writeMessage sind Methoden der Klasse SenderEmpfaenger, also brauchst du zum Aufrufen eine Instanz dieser Klasse (oder eine Referenz oder einen Zeiger darauf). Anbieten würde sich natürlich die, die du in main erzeugt hast. Normalerweise würde man in so einem Fall dem Thread einen Zeiger auf die SenderEmpfaenger-Instanz übergeben, und nicht 12 (warum eigentlich 12?). Übrigens ist strlen(a.c_str()) eine ziemlich holprige Lösung. std::string hat eine length-Methode. Zu deinem Linkerproblem: Wie du in der Doku zu den Funktionen nachlesen kannst, die da nicht aufgelöst werden konnten, musst du Ws2_32.lib linken. Zitieren
VaNaTiC Geschrieben 2. April 2009 Geschrieben 2. April 2009 die Aufrufkonvention von _beginthread() ist keine Referenz auf eine Funktion, sondern ein Funktionszeiger: _beginthread(writeThread, 0, (void*)12); _beginthread(sendThread, 0, (void*)12); Wobei ich die 12 auch nicht verstehe, oder verwendest Du die in der thread-Funktion wieder? Hier ein beispiel: _beginthread, _beginthreadex (CRT) Zitieren
Ischterai Geschrieben 2. April 2009 Autor Geschrieben 2. April 2009 _beginthread, _beginthreadex (CRT) Danke hat geholfen, die 12 ist falsch, da muss se hin: void __cdecl writeThread(void * arg) { SenderEmpfaenger *se = (SenderEmpfaenger*)arg; se->writeMessage(); } void __cdecl sendThread(void * arg) { SenderEmpfaenger *se = (SenderEmpfaenger*)arg; se->sendMessage(se->message); } int main(){ SenderEmpfaenger *se = new SenderEmpfaenger(); se->message="Morjen"; _beginthread(&writeThread, 0, se); _beginthread(&sendThread, 0, se); } Zitieren
VaNaTiC Geschrieben 3. April 2009 Geschrieben 3. April 2009 Und Du bist Dir sicher, dass Du _beginthread(&writeThread) schreiben musst?! Ich dachte mich zu erinnern, dass es ohne & sei. Zitieren
Klotzkopp Geschrieben 3. April 2009 Geschrieben 3. April 2009 Und Du bist Dir sicher, dass Du _beginthread(&writeThread) schreiben musst?! Ich dachte mich zu erinnern, dass es ohne & sei.Es ist egal. Ohne & ist es (laut Standard) ein "function designator", mit & ist es ein Funktionszeiger. Da beim Funktionsaufruf Function-Designator-Parameter aber sowieso in Funktionszeiger umgewandelt werden, ist das Ergebnis dasselbe. Wenn man es mit & schreibt, fällt eine implizite Konvertierung weg. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.