|
You last visited: Today at 11:03
Advertisement
Thread &nd nicht Statistische funktionen
Discussion on Thread &nd nicht Statistische funktionen within the C/C++ forum part of the Coders Den category.
07/20/2013, 11:27
|
#1
|
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(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.
|
|
|
07/20/2013, 11:51
|
#2
|
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.
|
|
|
07/20/2013, 12:18
|
#3
|
elite*gold: 0
Join Date: May 2013
Posts: 1,266
Received Thanks: 627
|
Quote:
Originally Posted by Schlüsselbein
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?
|
|
|
07/20/2013, 13:33
|
#4
|
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.
|
|
|
07/20/2013, 13:38
|
#5
|
elite*gold: 0
Join Date: May 2013
Posts: 1,266
Received Thanks: 627
|
Quote:
Originally Posted by Schlüsselbein
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.
|
|
|
07/25/2013, 13:40
|
#6
|
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.
|
|
|
07/25/2013, 18:39
|
#7
|
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
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
|
|
|
07/25/2013, 19:38
|
#8
|
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...
|
|
|
07/26/2013, 16:56
|
#9
|
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
|
|
|
07/26/2013, 19:08
|
#10
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Nein, so verbaut man sich am besten den Stil :/
|
|
|
 |
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.
|
|