Zum Inhalt springen

2 threads in c++ starten, die socketverbidung herstellen


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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);


}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...