2 threads in c++ starten, die socketverbidung herstellen

Ischterai

Mitglied
Morgen,

ich habe da ein Problem beim erstellen einer Socketverbindung durch 2 Threads.

Code:
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

Code:
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

Code:
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
 
Also ich habe schlechte Erfahrungen mit Threads gemacht, wenn sie miteinander zu tun haben.

Ich würde dir raten, das in einer Schleife zu machen ,ohne Threads, so nach dem Motto
C++:
while(was du willst){
  Clienten_annehmen();
  Nachrichten_publizieren();
}

Clienten_annehmen darf dann natürlich nicht einfach mit accept arbeiten, weil dein Programm sonst am accept festhängt, ich glaube bei den winsockets, da is select() das Zauberwort. Aber ich würde dir empfehlen, dir einen schönere Socketbibliothek zu suchen (wxWidgets z.B.)
 
Zuletzt bearbeitet von einem Moderator:
Danke für die hilfe, das problem ist nur das soll die vorarbeit von kommunizierenden Clients auf verschiedenen Pcs werden und da brauucht man threads zum testen:mad:.
 
Hi.
Code:
int main(){

	SenderEmpfaenger *se = new SenderEmpfaenger();
	_beginthread(&writeThread, 0, (void*)12);
	_beginthread(&sendThread, 0, (void*)12);

}
Warum übergibst du denn da eine 12 als dritten Parameter? Du solltest eine Parameterliste übergeben.

hier bei den threads komme ich net weiter, da ich write- bzw. sendMessage net rein krieg
Du kannst natürlich ohne Instanz einer Klasse nicht auf die Methoden zugreifen. Deshalb mußt du den Zeiger auf die SenderEmpfaenger Instanz an die _beginthread Funktion übergeben:
C++:
SenderEmpfaenger *se = new SenderEmpfaenger();
_beginthread(&writeThread, 0, se);

void __cdecl writeThread(void * arg)
{
  SenderEmpfaenger *se = (SenderEmpfaenger*)arg;

  se->writeMessage();
}
ich habs gerade auch mal so durchlaufen lassen, da kam:
Wenn du Funktionen der Socket-Bibliothek nutzen willst, dann mußt du auch die Socket-Bibliothek (ws2_32.lib) als zusätzliche Bibliothek in den Projekteinstellungen angeben.

Gruß
 
Zuletzt bearbeitet:
Du kannst natürlich ohne Instanz einer Klasse nicht auf die Methoden zugreifen. Deshalb mußt du den Zeiger auf die SenderEmpfaenger Instanz an die _beginthread Funktion übergeben:
cpp Code:

SenderEmpfaenger *se = new SenderEmpfaenger();
_beginthread(&writeThread, 0, se);

void __cdecl writeThread(void * arg)
{
SenderEmpfaenger *se = (SenderEmpfaenger*)arg;

se->writeMessage();
}

Zitat:

Danke, du hast mir den Tag gerettet, jetzt kann ich in die sonne gehen und schillen, war genau das richtige. thx nochmal
 
Zurück