Hi!
Ich wollte mich mal etwas intensiver mit Sockets auseinandersetzen, jedoch hab ich ein Problem.
Ich will mein Programm multi-threaded machen.
Hier erstmal der Code:
[Linker error] undefined reference to `run(mySock)'
[Linker error] undefined reference to `run(mySock)'
[Linker error] undefined reference to `clientHandler(mySock)'
ld returned 1 exit status
Warum bekomme ich Linker-Errors? clientHandler und run sind doch unten definiert. X(
Das Problem ist schätzungsweise das die Klasse die Funktionen benötigt und umgekehrt.
void run(void * ms) hab ich versucht, aber er meckert wenn ich auf memberobjekte von void zugreifen will. (eg verständlich, aber der Speicher ist doch der gleiche?!?
Muss ich da iwie von void auf mySock convertieren?)
Wie bekomme ich es ans laufen?
Ein paar Tips wären nicht schlecht.
MfG
AlterHacker
Ich wollte mich mal etwas intensiver mit Sockets auseinandersetzen, jedoch hab ich ein Problem.
Ich will mein Programm multi-threaded machen.
Hier erstmal der Code:
Code:
/*
sockets.h
*/
#include <windows.h>
#include <winsock2.h>
class mySock{
public:
long result;
WSADATA wsa;
SOCKET socketAccept;
SOCKET socketConnect;
SOCKADDR_IN addrBind;
int port;
public:
mySock(int port);
};
void clientHandler(mySock ms);
void run(mySock ms);
mySock::mySock(int port = 666){
this->result = WSAStartup(MAKEWORD(2,0), &this->wsa);
if(this->result != 0){
printf("WSAStartup() failed.Code: %d GetLastError() returns %d\n",result,GetLastError());
exit(-1);
}
printf("WSAStartup() completed.\n");
this->port = port;
/*addrBind initialisieren*/
memset(&this->addrBind,0,sizeof(SOCKADDR_IN));
this->addrBind.sin_port = htons(this->port);
this->addrBind.sin_family = AF_INET;
this->addrBind.sin_addr.s_addr = ADDR_ANY;
/*Bind versuch*/
this->result = bind(this->socketAccept, (SOCKADDR*) &this->addrBind, sizeof(SOCKADDR_IN));
if(this->result == SOCKET_ERROR){
printf("Bind() error! WSAGetLastError() returns %d\n",WSAGetLastError());
exit(-1);
}
printf("bind() completed.\n");
this->socketAccept = socket(AF_INET, SOCK_STREAM, 0);
this->result = listen(this->socketAccept, 10);
if(this->result == SOCKET_ERROR){
printf("listen() error! WSAGetLastError() returns %d\n",WSAGetLastError());
exit(-1);
}
printf("listen() completed.\n");
CreateThread(0,0, (LPTHREAD_START_ROUTINE) run, (LPVOID) this, 0,0);
}
void run(mySock *ms){
while(true){
ms->socketConnect = accept(ms->socketAccept, NULL, NULL);
if(ms->socketConnect==SOCKET_ERROR){
printf("accept() error! WSAGetLastError() returns %d\n",WSAGetLastError());
continue;
}
CreateThread(0,0, (LPTHREAD_START_ROUTINE) clientHandler, (LPVOID) &ms, 0,0);
}
}
void clientHandler(mySock *ms){
char buffer[256];
recv(ms->socketConnect, buffer, 255, 0);
printf("Client sendet %s\n",buffer);
send(ms->socketConnect, buffer, sizeof(buffer), 0);
closesocket(ms->socketConnect);
}
[Linker error] undefined reference to `run(mySock)'
[Linker error] undefined reference to `clientHandler(mySock)'
ld returned 1 exit status
Warum bekomme ich Linker-Errors? clientHandler und run sind doch unten definiert. X(
Das Problem ist schätzungsweise das die Klasse die Funktionen benötigt und umgekehrt.
void run(void * ms) hab ich versucht, aber er meckert wenn ich auf memberobjekte von void zugreifen will. (eg verständlich, aber der Speicher ist doch der gleiche?!?
Muss ich da iwie von void auf mySock convertieren?)
Wie bekomme ich es ans laufen?
Ein paar Tips wären nicht schlecht.
MfG
AlterHacker