Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 11:03

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Thread &nd nicht Statistische funktionen

Discussion on Thread &nd nicht Statistische funktionen within the C/C++ forum part of the Coders Den category.

Closed Thread
 
Old   #1
 
[uLow]NTX?!'s Avatar
 
elite*gold: 0
Join Date: May 2013
Posts: 1,266
Received Thanks: 627
Thread &nd nicht Statistische funktionen

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!


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(charip,charport){

                
connected false;
                
WSADATA wsa;
                
rc WSAStartup(MAKEWORD(2,0),&wsa);
                if (
rc == 0) {
                   
socket(AF_INET,SOCK_STREAM,0);
                   
SocketInstance::staticS s;
                    if (
== INVALID_SOCKET){
                        
disconnect();
                    }else{
                       
memset(&addr,0,sizeof(SOCKADDR_IN));
                        
addr.sin_family=AF_INET;
                        
addr.sin_port htonsatoiport ) );

                        
addr.sin_addr.s_addr=inet_addrip );

                        
rc connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));

                        if (
rc == SOCKET_ERROR){
                            
disconnect();
                            return 
false;
                        }
                        else {
                            
connected true;
                            
hThread CreateThread(NULL0, (LPTHREAD_START_ROUTINE)recvData NULL0NULL);

                            return 
true;
                        }
                    }
                }

                return 
false;
            }

             
int sendToServer(charbuf){
                    
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.
[uLow]NTX?! is offline  
Old 07/20/2013, 11:51   #2
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Code:
#include <iostream>
#include <thread>

struct foo
{
	void bar()
	{
		std::cout << std::this_thread::get_id() << std::endl;
	}

	void start()
	{
		std::thread t(&foo::bar, this);
		std::cout << std::this_thread::get_id() << std::endl;
		t.join(); // bzw t.detach()
	}
};

int main()
{
	foo f;
	f.start();
}
Dein Code ist mehr C, als C++. Benutz C++ wenn dann schon mit allen Features und denke mal darüber nach, eine fertige Netzwerklib zu benutzen.
Schlüsselbein is offline  
Thanks
1 User
Old 07/20/2013, 12:18   #3
 
[uLow]NTX?!'s Avatar
 
elite*gold: 0
Join Date: May 2013
Posts: 1,266
Received Thanks: 627
Quote:
Originally Posted by Schlüsselbein View Post
Code:
#include <iostream>
#include <thread>

struct foo
{
	void bar()
	{
		std::cout << std::this_thread::get_id() << std::endl;
	}

	void start()
	{
		std::thread t(&foo::bar, this);
		std::cout << std::this_thread::get_id() << std::endl;
		t.join(); // bzw t.detach()
	}
};

int main()
{
	foo f;
	f.start();
}
Dein Code ist mehr C, als C++. Benutz C++ wenn dann schon mit allen Features und denke mal darüber nach, eine fertige Netzwerklib zu benutzen.
Könntest du mir einen lib empfehlen?

Und sieht mein Struktur von dem Code so ok aus?
[uLow]NTX?! is offline  
Old 07/20/2013, 13:33   #4
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Was hast du vor? Je nach Problemstellung kann man Libs empfehlen.
Der Code ist so ganz okay - gibt hier in jedem zweiten Thread schlimmeres.
Schlüsselbein is offline  
Thanks
1 User
Old 07/20/2013, 13:38   #5
 
[uLow]NTX?!'s Avatar
 
elite*gold: 0
Join Date: May 2013
Posts: 1,266
Received Thanks: 627
Quote:
Originally Posted by Schlüsselbein View Post
Was hast du vor? Je nach Problemstellung kann man Libs empfehlen.
Der Code ist so ganz okay - gibt hier in jedem zweiten Thread schlimmeres.
Aso okay ;D

Ich habe vor in richtung Clientless mit einer GUI zu arbeiten.
[uLow]NTX?! is offline  
Old 07/25/2013, 13:40   #6
 
Tyrar's Avatar
 
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
Um ehrlich zu antworten: der Code ist Schrott.

1. Du initialisierst die WinSock API bei jeder Verbindung komplett neu.
2. Du übergibst selbst den Port als char array.
3. Warum überhaupt char arrays und nicht die schöne std::string Klasse?
4. Ein statischer Inputbuffer, wo man die eigentliche größe der Daten auslesen könnte.
5. Beim senden der Daten mit strlen zu arbeiten ist in den meisten Fällen auch nicht sehr ratsam. Besonders wenn es auch binäre Daten sind, die gesendet werden sollen.
6. Warum überhaupt so viel C wenn dir doch die Möglichkeiten von C++ zur verfügung stehen?
(7.) Ist der Stil unschön.

Zur Frage selbst: ich habe mir für meinen Clientless eine thread Klasse geschrieben, die eine pure virtual funktion namens "run" besitzt und eine statische member funktion namens "__run", welche für die Threadstart Funktionen verwendet wird. Meine Klassen erben von der Thread-Klasse und implementieren die Funktion "run()", welche dann die nicht statische Memberfunktion ist.
Tyrar is offline  
Thanks
2 Users
Old 07/25/2013, 18:39   #7
 
[uLow]NTX?!'s Avatar
 
elite*gold: 0
Join Date: May 2013
Posts: 1,266
Received Thanks: 627
Hätte erlich nicht gedacht, dass einer von euch beiden auf den Thread Antworten wird.

Naja meine antworten sind rot
Quote:
Originally Posted by HeavyHacker View Post
Um ehrlich zu antworten: der Code ist Schrott. Deswegen erwähnte ich, dass ich ein Anfänger bin

1. Du initialisierst die WinSock API bei jeder Verbindung komplett neu.
2. Du übergibst selbst den Port als char array. 1&2 -> Jup, hat den Grund das ich das als KLasse machen wollte, welche ich nicht nur für dieses "Projekt" nutzen will, deswegen auch Port & IP
3. Warum überhaupt char arrays und nicht die schöne std::string Klasse?
4. Ein statischer Inputbuffer, wo man die eigentliche größe der Daten auslesen könnte.
5. Beim senden der Daten mit strlen zu arbeiten ist in den meisten Fällen auch nicht sehr ratsam. Besonders wenn es auch binäre Daten sind, die gesendet werden sollen.Ist doch ein verbesserungsvorschlag -> Siehe Vorwort 1st Post Danke
6. Warum überhaupt so viel C wenn dir doch die Möglichkeiten von C++ zur verfügung stehen?[COLOR="Red"]Um erlich zusein, weil ich den genauen unterschied zwischen C & c++ vorher noch nicht kannte und ich mich erst nahc dem Post von Schlüsselbein mit den genauen Unterschied auseinandergesetzt habe /COLOR]
(7.) Ist der Stil unschön.

Zur Frage selbst: ich habe mir für meinen Clientless eine thread Klasse geschrieben, die eine pure virtual funktion namens "run" besitzt und eine statische member funktion namens "__run", welche für die Threadstart Funktionen verwendet wird. Meine Klassen erben von der Thread-Klasse und implementieren die Funktion "run()", welche dann die nicht statische Memberfunktion ist. Joar ich will den Char bisher nur Ingame sehen und evtl später mal sehen ob ich weitermache
Btw. Ich habe eine lösung gefunden mit der ich erstmal zufrieden bin, ich werde die zwar sicher noch überarbieten aber das hat erstmal zeit.

v.d #clsreq
[uLow]NTX?! is offline  
Old 07/25/2013, 19:38   #8
 
Tyrar's Avatar
 
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
Was ich mit Punkt 1 sagen wollte: es wäre intelligenter, die Winsock API nur einmal ganz am Anfang des Programms zu initialisieren.
Mit Punkt 2: warum übergibst du nicht einfach direkt einen short integer?

Außerdem als Anfänger direkt so ein Projekt... Meeehhh...
Tyrar is offline  
Old 07/26/2013, 16:56   #9
 
_Roman_'s Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 1,620
Received Thanks: 237
Mag ja sein, dass man als Anfänger nicht die komplette Ahnung für so ein Projekt hat, aber learning by doing sag ich nur. So lernt man am besten
_Roman_ is offline  
Old 07/26/2013, 19:08   #10


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Nein, so verbaut man sich am besten den Stil :/
MrSm!th is offline  
Thanks
5 Users
Closed Thread


Similar Threads Similar Threads
[B]Signatur Werbung Statistische Täg. Beiträge 35+ [S]E*gold
02/28/2013 - elite*gold Trading - 35 Replies
Macht mir angebote Mein Früherer Preis war immer 2Monate 45Egold Da ich inaktiver geworden bin ich trotzdem Tägl. beiträge mache nur keine 100 mehr am Tag lasse ich euch mal Entscheiden. Angebote die mir gefallen nehme ich an, und PNE euch mit einer Treasure Schreibt bitte Thema/Link:
[B]Signatur Werbung Statistische Täg. Beiträge 52+ [S]E*gold
11/14/2012 - elite*gold Trading - 8 Replies
http://i.imgur.com/D85fI.png - Viele Beiträge. - Seit paar Tagen wieder sehr Aktiv. - nicht Teuer. - Textlinks Per Privaten Nachricht bitte den Link schicken zum Thema, wenn du eine andere Überschrift haben möchtest schreibe das bitte dazu. Sollte ich einmal einen Tag garnicht posten wird die Werbung um 1 Tag verlängert. Solltest du gebannt werden, verfällt die Werbung! Kein Ersatzt!
Metin2 - Python Funktionen gehen nicht
10/02/2011 - General Coding - 5 Replies
Ich habe eine einfache dll in C++ geschrieben mit dem C++ Builder den hier alle so empfehlen. Der ist auch nicht schlecht, aber ich habe ein Problem. Ich will zB die Python-Funktion AppendChat aufrufen, das mache ich so: void AppendChat(char *msg, int mode) { PyObject* arguments = PyTuple_New(2); PyTuple_SetItem(arguments, 0, PyInt_FromLong(mode)); PyTuple_SetItem(arguments, 1, PyString_FromString(msg));
M2 Fish 4.0 Statistische Bestzeit
08/10/2011 - Metin2 - 4 Replies
Hey, bei der 4.0 angelbot Version von .ErpeL gibts ja diese Sttatistik. Also wenn man die an hat sucht die halt die Statistische Bestzeit in dem der Bot ganz viele Fishdelays testet . Jetzt Meine Frage : Wo sieht man die Beste Zeit ?? Bei den vorherigen Versionen war es ja so das die beste Zeit im Fishdelay stand aber ich glaube kann das 3500 eine gute Zeit ist :D Mfg
D3D Hack Funktionen finktionieren nicht!
10/26/2010 - WarRock - 5 Replies
hi ich habe mir ein D3D hack gemacht der auch soweit funkt ausser die funktionen wenn ich auf On macher passiert nicht. was habe ich falsch gemacht? :(



All times are GMT +1. The time now is 11:03.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.