hey,
Vorweg: ich bin (so würde ich es mal sagen) erst ein Anfänger in sachen C++, also nicht gleich rummeckern weil code XY nicht gut aussieht . Verbesserungsvorschlage sidn jedoch gerne gesehen! :D
Also ich habe mit Winsock 2 einen Klasse erstellt mit der ich auch zu einem TCP Server verbinden kann und auch senden kann, soweit ist das kein problem.
Ich möchte nun natürlich auch daten empfangen können und brauche eine recv() funktion.
ich hatte mir gedacht diese Funktion in einem neuen Thread laufen zulassen, da die recv() funktion solange blockt, bis etwas neues reinkommt.
Nur kann ich aus diesem Thread nicht auf den SOCKET zugreifen, weil er nicht static ist und das ist mein problem..
Wie kann ich dieses Problem lösen?
Hier auchnoch die klasse:
Ich sage schonmal im vorwege Danke für eure Hilfe.
Vorweg: ich bin (so würde ich es mal sagen) erst ein Anfänger in sachen C++, also nicht gleich rummeckern weil code XY nicht gut aussieht . Verbesserungsvorschlage sidn jedoch gerne gesehen! :D
Also ich habe mit Winsock 2 einen Klasse erstellt mit der ich auch zu einem TCP Server verbinden kann und auch senden kann, soweit ist das kein problem.
Ich möchte nun natürlich auch daten empfangen können und brauche eine recv() funktion.
ich hatte mir gedacht diese Funktion in einem neuen Thread laufen zulassen, da die recv() funktion solange blockt, bis etwas neues reinkommt.
Nur kann ich aus diesem Thread nicht auf den SOCKET zugreifen, weil er nicht static ist und das ist mein problem..
Wie kann ich dieses Problem lösen?
Hier auchnoch die klasse:
PHP Code:
//---------------------------------------------------------------------------
#pragma comment( lib, "ws2_32.lib" )
#include "Unit1.h"
#include <Winsock2.h>
#include <windows.h>
//---------------------------------------------------------------------------
class SocketInstance{
private:
bool connected;
SOCKET s;
SOCKET staticS;
SOCKADDR_IN addr;
long rc;
HANDLE hThread;
static DWORD recvData(){
while(true ){
char buf[1024];
//recv(s,buf,sizeof(buf),0);
/*if (rc == SOCKET_ERROR) {
Form1->Memo1->Lines->Add("Connection to server lost");
break;
} */
Sleep(10);
}
}
public:
bool createSocket(char* ip,char* port){
connected = false;
WSADATA wsa;
rc = WSAStartup(MAKEWORD(2,0),&wsa);
if (rc == 0) {
s = socket(AF_INET,SOCK_STREAM,0);
SocketInstance::staticS = s;
if (s == INVALID_SOCKET){
disconnect();
}else{
memset(&addr,0,sizeof(SOCKADDR_IN));
addr.sin_family=AF_INET;
addr.sin_port = htons( atoi( port ) );
addr.sin_addr.s_addr=inet_addr( ip );
rc = connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
if (rc == SOCKET_ERROR){
disconnect();
return false;
}
else {
connected = true;
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)recvData , NULL, 0, NULL);
return true;
}
}
}
return false;
}
int sendToServer(char* buf){
send(s,buf,strlen(buf),0);
if ( WSAGetLastError() == 0 ) {
return 1;
} else{
return 0;
}
}
void disconnect(){
TerminateThread(hThread,0);
connected = false;
closesocket(s);
WSACleanup();
}
void getLastError(){
ShowMessage( WSAGetLastError() );
}
};
Ich sage schonmal im vorwege Danke für eure Hilfe.