Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 21:58

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

Advertisement



[C++]Sockets Frage

Discussion on [C++]Sockets Frage within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
MrSimonKeks's Avatar
 
elite*gold: 0
Join Date: Nov 2009
Posts: 116
Received Thanks: 13
Question [C++]Sockets Frage

Hallo Leute
Also ich fange gerade an ein wenig mit Sockets herumzuexperimentieren etc. und eins, zwei Programme zu schreiben.Nun wollte ich zuerst einmal fragen ob der Code so richtig erscheint und womit ich mein Programm sozuagen ,,Testen" kann.
Also hier der Code:
PHP Code:
/*
   Ws2_32.lib per Optionen des Projektes gelinkt...
   Ich könnte auf via #pragma comment(lib,Ws2_32.lib) linken
  ***später vielleicht verändern***
*/
#include "stdafx.h" //include<iostream>, include<WinSock2.h>,
//------------------------Pause Befehl-----------------------
void sleep(){
    
int sl;
    
std::cout<<"Zum Fortfahren eine beliebige Taste eingeben und mit Enter bestaetigen!!!"<<std::endl;
    
std::cin>>sl;
}


//----------------------------------Main-Funktion--------------------------------------
void main(){
    
//--------------------------------WSAStartup------------------------------
    
WSADATA wsaData;
    
WSAStartup(MAKEWORD(1,1),&wsaData);
    
//-------------------------------Sockets ----------------------------
    
SOCKET virhos
    
virhos socket(AF_INET,SOCK_STREAM,0); 
    
SOCKET virent;
    
virent socket(AF_INET,SOCK_STREAM,0);
    
// ----------------------------Überprüfung der ERstellung------------------
    
if(virent!=-1&&virhos!=-1){

        
std::cout<<"Sockets erfolgreich erstellt!!!"<<std::endl;

    }
//if sockets
    //---------------------------Adresse-------------------------------
    
struct sockaddr_in addr;
    
addr.sin_familyAF_INET;
    
addr.sin_addr.s_addrinet_addr("143.232.7.16");
    
addr.sin_porthtons(7456);
    
//-------------------------------virent binden (später listen)------------------------
    
bind(virent,(SOCKADDR*)&addr,(sizeof(&addr)));
    
//--------------------------------bind kontrolle---------------------------
    
if(bind(virent,(SOCKADDR*)&addr,(sizeof(&addr))!=-1)){

        
std::cout<<"Socket erfolgreich gebunden!!!"<<std::endl;


    }
//if bind
    //-------------------------addresslenge für addrlen(Parameter)------------------------
    
int addrlength= (sizeof(&addr));
    
//--------------------------listen (virent, bis einer connectet) .--------------------------
    
listen(virent,SOMAXCONN);
    
//--------------------------Endlosschleife zum warten auf accept()--------------------
    
for(;;){
        
     if((
virhos=accept(virent,(SOCKADDR*)&addr,&addrlength))!=-1){

         
std::cout<<"Client found"<<std::endl;
     }
//if in for


    
//for
    
sleep(); // pause befehl





}//main 
Das Problem:
Ich verstehe den Code nicht 100% besonders an einer Stelle habe ich Probleme.
Hier der Codeabschnitt meines Problemes ;D:
PHP Code:
for(;;){
        
     if((
virhos=accept(virent,(SOCKADDR*)&addr,&addrlength))!=-1){

         
std::cout<<"Client found"<<std::endl;
     }
//if in for


    
//for 
Probleme:
1.Die Schleife:
-ist es gut jede paar millisekunden zu überprüfen, ob jemand aus der Warteliste akzeptiert wird?
-frisst die Schleife nicht sehr viel Rechenleistung (im Verhältnis)
-könnte ich dieses Problem vllt. durch eine Sleep(zeit in millisekunden) Funktion (Windows.h) beheben, indem er nur alle 30 sekunden checkt
2. Der code an sich:
-
PHP Code:
     if((virhos=accept(virent,(SOCKADDR*)&addr,&addrlength))!=-1
-Warum überprüft man ob einer Connected indem man die zweite Socket variablen "missbraucht" ?
-Könnte man nicht if(accept(virent,(SOCKADDR*)&addr,%addrlength)!=-1) schreiben?
3. Es funktioniert nicht:
-ich habe diesen Code aus einem Tutorial ein wenig "geklaut" aber er funktioniert nicht (im Tutorial schon) (siehe nächste Punkte was gemeint)
-Es gibt keine compilierfehler etc.
-ich weiß nicht genau ob man mit der ping Funktion von cmd den Server "Testen" kann...
-windows7->kein telnet
-wie kann ich es austesten ohne telnet?
-Programm "funktioniert" nur wenn ich via ping Funktion testen möchte gibt es zeitüberschreitung (Pakete verloren 100%)


So das sind meine Probleme ich hoffe ihr könnt mir helfen es kann natürlich auch sein das etwas anderes im Code nicht stimmt.
Mfg Simon
P.S.: Folgende gehen auch nicht:
if(virhos=accept(...)) //dauernde ausgabe Cleint found was nur logisch ist ;D
if(accept(...)!=-1)
if(virhos==accept(...))
P.S2:Rechtschreibfehler schenke ich euch (schnell geschrieben)!!!

MrSimonKeks is offline  
Old 03/02/2011, 18:32   #2
 
black0utCpp's Avatar
 
elite*gold: 0
Join Date: Oct 2010
Posts: 381
Received Thanks: 210
Die main funktion gibt einen integer zurück insofern heißt es INT main und nicht void !
bzw. sie sollte einen Integer zurückgeben die Main funktion als void zu definieren ist Unsinn.
Des Weiteren ist die sleep Funktion auch unnötig , da es a) keine echte Sleep Funktion ist (auf die cpu bezogen) und da es Windows.h spezifische Funktionen wie Sleep(dword milliseconds) oder einfach getchar() gibt zu den Fehlern ich habe wirklich keine Lust mir den ganzen Code durch zu lesen aber ich würde dir empfehlen erstmal die Grundlagen zu 100% abzudecken bevor ich mich an Windows Socket mache! und warum zur Hölle benutzt du Port 7456 ?

Edit : Hab mir den Code mal durch gelesen , heftiger Würgreiz
black0utCpp is offline  
Thanks
1 User
Old 03/02/2011, 19:21   #3
 
MrSimonKeks's Avatar
 
elite*gold: 0
Join Date: Nov 2009
Posts: 116
Received Thanks: 13
deßhalb hieß es ja auch "herumexperimentieren" ..
Nach meinem Wissen muss die main keinen wert zurückgeben in diesem Fall wohl return 0, da das return 0 nur ein feedback abgibt ob alles geklappt hat und das Programm ohne Fehler beendet wurde (benutze es eig. auch aber da wohl vertausch ist wie gesagt ein wenig pseudocode)
Und was den Port angeht, ist der nicht egal ? Oder hab ich da etwas falsches verstanden?
Muss ich einen Port angeben der schon besetzt ist zb den port von mysql.
Oder einfach eine NULL reinsetzen?
Ich habs so verstanden das man irgendeinen Port setzen kann er sollte nur über 2000 sein, da unter 2000 so gut wie alle "reserviert" sind.
Vllt. hab ich da auch etwas falsches verstanden.
Die sleep Funktion ist im Moment nur sozusagen eine keep_window_open Funktion.
Wie gesagt alles ein wenig Provisorisch(oder wie man das auch schreibt )
MrSimonKeks is offline  
Old 03/02/2011, 19:28   #4
 
black0utCpp's Avatar
 
elite*gold: 0
Join Date: Oct 2010
Posts: 381
Received Thanks: 210
ja und wenn du die main funktion als void definierst weißt du nicht , wie sie sich beendet hat also erfolgreich oder nicht .

Zu dem Port : NULL ist gar keine Alternative du musst einen Port angeben ! Der Port 7456
geht prinzipiell auch in Ordnung du musst halt nur schauen ob der Server connections von dem Port akzeptiert wenn nicht musst du in den Router und den Port freischalten !
black0utCpp is offline  
Thanks
1 User
Old 03/02/2011, 19:32   #5
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Quote:
if((virhos=accept(virent,(SOCKADDR*)&addr,&addrlen gth))!=-1)
Allein wegen der Variablen-Namen sollte man dich bannen. Scriptkiddy...


Das durchlesen und nicht weinen, weil es C ist:


Oder gleich boost:asio verwenden. Bzw. in die Grundlagen der Netzwerkprogrammeirung einlesen (Server, Client, Socket)... Und dann erst 1337 Viren schreiben.

EDIT: @Vorposter:
Code:
#define NULL 0
xNopex is offline  
Old 03/02/2011, 19:34   #6
 
black0utCpp's Avatar
 
elite*gold: 0
Join Date: Oct 2010
Posts: 381
Received Thanks: 210
Gaaanz ruhig
black0utCpp is offline  
Thanks
1 User
Old 03/02/2011, 19:34   #7
 
MrSimonKeks's Avatar
 
elite*gold: 0
Join Date: Nov 2009
Posts: 116
Received Thanks: 13
Hmm ja das hatte ich ganz vergessen ports freizuschalten.
Ich werde morgen es mal damit versuchen (wieder mal etwas für die größten programmier fails )
Omg virhos heißt doch nicht gleich virus das ist eine Variable wie x oder y . Mir wäre der name nichteinmal aufgefallen hab mir schließlich irgendwas ausgedacht ( wollte ursprünglich wirhos fü ein multiplayer snake machen ) wo von ich jawohl noch weit entfernt bin.Fange eh bal mit C an wegen den Data Types und vielen anderen sachen wie den Parametern in Funktionen. Also sach ich mal ruhig blut brauner ;D Ich habe sicher nicht vor Hacks zu schreiben!
MrSimonKeks is offline  
Old 03/02/2011, 19:37   #8
 
black0utCpp's Avatar
 
elite*gold: 0
Join Date: Oct 2010
Posts: 381
Received Thanks: 210
Quote:
Originally Posted by xNopex View Post
EDIT: @Vorposter:
Code:
#define NULL 0
?
Port 0 :
Port 0 is officially a reserved port in TCP/IP networking, meaning that it should not be used for any TCP or UDP network communications. However, port 0 sometimes takes on a special meaning in network programming, particularly Unix socket programming. In that environment, port 0 is a programming technique for specifying system-allocated (dynamic) ports.
black0utCpp is offline  
Thanks
1 User
Old 03/02/2011, 19:39   #9
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Das soll ausdrücken, dass NULL in C++ als 0 definiert ist, was rein theoretisch als Port-Nummer zulässig ist. Deshalb wäre NULL eine (schlechte) Alternative. Soweit Port0 nicht iwie durch das OS geblockt wird oder es einen Hardwaretechnischen Grund geben sollte, dass es nicht über Port 0 funktioniert.

EDIT:
Quote:
Omg virhos heißt doch nicht gleich virus das ist eine Variable wie x oder y . Mir wäre der name nichteinmal aufgefallen hab mir schließlich irgendwas ausgedacht ( wollte ursprünglich wirhos fü ein multiplayer snake machen ) wo von ich jawohl noch weit entfernt bin.
KTzG hat auch nur "zufällig" die gleichen Wörter abgeschrieben. Die könnten auch ganz anders lauten... Den Namen hast dud ir nicht ausgedacht, weil du den Code, wie oben zugegeben, kopiert hast. Das unterscheidet dich von unserem Baron. virhos = virhost; virient = virclient

EDIT2: Könntet ihr bitte eure Edits als solche Kennzeichnen... Das wäre um einiges übersichtlicher.
xNopex is offline  
Old 03/02/2011, 19:42   #10
 
black0utCpp's Avatar
 
elite*gold: 0
Join Date: Oct 2010
Posts: 381
Received Thanks: 210
Ich habe mich schlecht artikuliert ich meinte , dass null ergo 0 keine sinvolle Alternative ist !

EDIT :
Quote:
Könntet ihr bitte eure Edits als solche Kennzeichnen... Das wäre um einiges übersichtlicher.]
Klar kein Flamewar bitte ?
black0utCpp is offline  
Thanks
1 User
Old 03/02/2011, 19:52   #11
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Erstmal in WIkipedia gelesen, was ein Flame-War ist, um dir zu versichern, dass ich weder unsachlich noch beleidigend argumentiere und der Thread auch in keinen Krieg ausarten wird. Ich wollte nur drauf hinweisen, dass es sehr ärgerlich ist, wenn man, jedesmal, wenn man auf F5 drückt, in einem Beitrag über deinem etwas neues liest, worauf man Bezug nehmen möchte, was einem vllt. aber erst 3-4 Beiträge später auffällt, weil es nicht als EDIT gekennziechnet wurde.

B2T:
Quote:
Ich habe sicher nicht vor Hacks zu schreiben!
Schreib einfach einen Chat oder einen lahmen Datei-Serverund verwende dabei sinnvolle Variablennamen und verkaufe uns nicht für dumm.
xNopex is offline  
Old 03/02/2011, 19:55   #12
 
MrSimonKeks's Avatar
 
elite*gold: 0
Join Date: Nov 2009
Posts: 116
Received Thanks: 13
Öhm nach meinen Wissens hat der Mensch von Youtube oder auch von der einen Website jeweils sConnect und sListen benutzt von daher sind meine Variablen ausgedacht. Außerdem hab ich nur den Problemcode kopiert weil ich den wie schon gesagt nicht ganz verstehe. Vllt. Habe ich mich ein wenig ,, unglücklich " ausgedrückt.. Naja Schwamm drüber und wer zur Hölle istKTzG ?
Edit: Ein Kind lernt erst laufen bevor es gehen kann .
MrSimonKeks is offline  
Old 03/02/2011, 19:57   #13
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471


Zeitung lesen...
xNopex is offline  
Old 03/02/2011, 20:10   #14
 
MrSimonKeks's Avatar
 
elite*gold: 0
Join Date: Nov 2009
Posts: 116
Received Thanks: 13
Schreibe Namen bitte aus damit ich weiß wen du meinst es kann schließlich auch ein Kosename sein . Und Zeitung lese ich zwar nicht aber ich schaue (auch gerade ) tagesschau und höre radio . Mach dir kein falsches Bild von mir .
Edit: bayern 3:1 schalke was denkt ihr?
MrSimonKeks is offline  
Old 03/03/2011, 18:19   #15
 
MrSimonKeks's Avatar
 
elite*gold: 0
Join Date: Nov 2009
Posts: 116
Received Thanks: 13
So ich habe jetzt nochmal einen neuen Code erstellt der (hoffentlich) übersichtlicher ist.
Leider Funktioniert der aber auch nicht ich habe den Port freigegeben für meinen Router, aber wenn ich den server anpinge (lustiges Wort) dann kommt:
Bei ping 144.16.78.34:5555 Host konnte nicht gefunden werden.
Bei ping 144.16.78.34 Zielhost nicht erreichbar.
Hier der Code (hoffentlich ist er leserlich):
PHP Code:
/* TestServer.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//Includes:
//Windows.h WinSock2.h iostream
//Ws2_32.lib gelinkt
*/
#include "stdafx.h"
//----------------Sleep-------------------
void sleep() {char chstd::cin>>ch;}
//.------------------------------------------------------------ main------------------------------------------------
int main(){
/*  DIESEN KOMMENTAR NICHT BEACHTEN DAS IST NUR SO EINE IDEE
    //-------------------Variablen für die Adressen--------------
    
    ULONG ip;
    u_short port;
    //-------------------Port & ip eingabe des Users-----------
    std::cout<<"Bitte geben sie die ip fuer den Server an:"<<std::endl;
    std::cin>>ip;
    std::cout<<"Bitte geben sie den Port fuer den Server an:"<<std::endl;
    std::cin>>port;

    // C-String in ULONG bzw. u_short casten??? 


*/
    //--------------------Winsock------------------------
    
WSADATA WsaData;
    
WSAStartup(MAKEWORD(1,1),&WsaData);
    
//-------------------Sockets sListen & sServer------------------
    
SOCKET sListen socket(AF_INET,SOCK_STREAM,0);
    
SOCKET sServer socket(AF_INET,SOCK_STREAM,0);
    if(
sListen!=-&& sServer!=-1){

        
std::cout<<"Socken build sucsess!"<<std::endl;

    }
    else{

        
std::cout<<"Error, Socken build failed!"<<std::endl;
    }
    
//-------------------addr------------------------------
    
SOCKADDR_IN addr;
    
addr.sin_addr.s_addr inet_addr("144.16.78.34");
    
addr.sin_family      AF_INET;
    
addr.sin_port        htons(5555);
    
//-------------------bind sListen------------------
    
bind(sListen,(SOCKADDR*)&addr, (sizeof(&addr)));
    if(
sListen!=-1){

        
std::cout<<"Socken bind sucsess!"<<std::endl;

    }
    else{

        
std::cout<<"Error, Socken bind failed!"<<std::endl;
    }
    
//------------------sListen listen-------------------
    
listen(sListen,SOMAXCONN);
    if(
listen){

        
std::cout<<"Now listening..."<<std::endl;
    }
    else{

        
std::cout<<"Error, listen failed!"<<std::endl;
    }
    
//-----------------sizeof addr---------------
    
int addr_length = (sizeof(&addr));
    
//-------------------if a connect-----------------
    
for(int i=0i<100;i++){

        
//--------------------------------------------------------------------
        
if(accept(sListen,(SOCKADDR*)&addr,&addr_length)!=-1){
            
system("cls");
            
std::cout<<"Incoming Connection..."<<std::endl;

        }


        else{
            
Sleep(1000);
            
std::cout<<"Wait:"<<i<<" sec."<<std::endl;
        }
        
//--------------------------------------------------------------------

        
if(i==99){
            
system("cls");
            
std::cout<<"No Connection found!(Search timed out)"<<std::endl;
        }

    }
    
//-----------------sleep----------------
    
sleep();
    
//----------------return 0--------------------------
    
return 0;

So hoffentlich erkennt jemand den Fehler Gruss Simon
MrSimonKeks is offline  
Reply


Similar Threads Similar Threads
[AutoIT] Frage - TCP Sockets
10/05/2010 - Metin2 Private Server - 7 Replies
Nachdem ich das Paket Tool für die API Befehle nun in PHP fertig habe, habe ich mit westside gewettet, das ich das ganze auch in AutoIT schaffe.. ^^ Leider ist es da nicht so einfach wie erwartet und ich hänge nun an einem Punkt wo ich selbst keinen Rat mehr weiß. In PHP versende ich meine Packets folgendermaßen; $socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); $result = socket_connect ($socket, $IP, $Port);
Sockets first to log in after SM
03/14/2007 - Conquer Online 2 - 13 Replies
If i was the first to log in after SM will the 1st met be the socket? or is there a certian amount i would have to spam? Thanks :) cheers i have quit this game for a while but I am back now. :P
sockets bah
06/22/2006 - Conquer Online 2 - 5 Replies
just upgrading normally ive made sok tao cap and sok archer coat its pure luck nothing to do with any so called "tricks" i have a friend who makes sockets for a living he showed me his warehouses every one is filled with met scrolls SPAMMING METS IS THE ONLY WAY TO GET SOCKETS ending pending...
Sockets in CO?
03/16/2006 - Conquer Online 2 - 14 Replies
I was reading through the socket thread on the other forum and such... I know a few people who are 100 pct on making 1 socket and around 90 pct on the 2nd socket... So I am wondering if there is a way to make it happen without a chance of failure? I know that the Conquer Online Beta Client (the old old one) you can make sockets without worry on anything with that client... Does anyone know where to get it or know someone who'd upload it to a server? Or just knows a fool proof way to...



All times are GMT +1. The time now is 21:59.


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.