C++ Socket

Diskutiere C++ Socket im Developer Network Forum im Bereich Hardware & Software Forum; Hi, also ich habe mir mal die Arbeit gemacht ein Socket klasse zu erstellen damit man damit leichter arbeiten kann. Leider ist irgendwo ein...
  • C++ Socket Beitrag #1
Matyr

Matyr

Bekanntes Mitglied
Dabei seit
09.03.2007
Beiträge
428
Reaktionspunkte
0
Hi,
also ich habe mir mal die Arbeit gemacht ein Socket klasse zu erstellen damit man damit leichter arbeiten kann. Leider ist irgendwo ein kleiner Fehler drin, meine ich zumindest, denn wenn ich einen clienten und einen server damit programmiere klapt das senden nicht.

Ps. Auch bitte einmal Bewerten wie die ist, also wie ihr die findet.

Mfg. Matyr

#include <iostream>
#include <winsock2.h>

using namespace std;

class INET
{
private:

long fehler; ///Fehler Behandlung

SOCKET acceptSocket;
SOCKET connectedSocket;
SOCKADDR_IN addr;

bool Schleife; /// Empfangsschleife




public:


void start_winsock()
{
WSADATA wsa;
fehler=WSAStartup(MAKEWORD(2,0),&wsa);
fehler_behandlung("start_winsock");
}

void socket_erstellen()
{
acceptSocket=socket(AF_INET,SOCK_STREAM,0);
fehler_behandlung("socket");
}

void daten_senden(char* Daten)
{
send(connectedSocket,Daten,strlen(Daten),0);
}

void daten_empfangen(char *array)
{
fehler=recv(connectedSocket,array,100,0);
array[fehler]='\0';
fehler_behandlung("empfangen");

}

bool check_schleife()
{
return Schleife;
}




///Server anwendungen
void server_socket_binden(int Port)
{
memset(&addr,0,sizeof(SOCKADDR_IN));
addr.sin_family=AF_INET;
addr.sin_port=htons(Port);
addr.sin_addr.s_addr=ADDR_ANY;
fehler=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
fehler_behandlung("s_binden");
}

void server_listen_modus()
{
fehler=listen(acceptSocket,10);
fehler_behandlung("s_listen");
}

void server_connect()
{
connectedSocket=accept(acceptSocket,NULL,NULL);
fehler_behandlung("s_connect");
}


///Client anwendungen
void client_socket_binden(int Port,char* Ip)
{
memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
addr.sin_family=AF_INET;
addr.sin_port=htons(Port); // wir verwenden mal port 12345
addr.sin_addr.s_addr=inet_addr(Ip); // zielrechner ist unser eigener
fehler_behandlung("binden");
}

void client_connect()
{
fehler=connect(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));
fehler_behandlung("c_connect");
}


void fehler_behandlung(char* name)
{
if(name=="start_winsock")
{
if(fehler!=0)
{
cerr<<"Fehler: start_winsock , fehler code: \n"<<fehler;
}
else
{
cerr<<"Winsock gestartet!\n";
}
}

else if(name=="socket")
{
if(acceptSocket==INVALID_SOCKET)
{
cout<<"Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n"<<WSAGetLastError();
}
else
{
cout<<"Socket erstellt!\n";
}
}

else if(name=="binden")
{
if(fehler==SOCKET_ERROR)
{
cout<<"Fehler: bind, fehler code: %d\n"<<WSAGetLastError();
}
else
{
cout<<"Socket gebunden\n";
}
}

else if(name=="s_listen")
{
if(fehler==SOCKET_ERROR)
{
cout<<"Fehler: listen, fehler code: %d\n"<<WSAGetLastError();
}
else
{
cout<<"acceptSocket ist im listen Modus....\n";
}
}
else if(name=="s_connect")
{
if(connectedSocket==INVALID_SOCKET)
{
cout<<"Fehler: accept, fehler code: %d\n",WSAGetLastError();
}
else
{
cout<<"Neue Verbindung wurde akzeptiert!\n";
}
}
else if(name=="empfangen")
{
if(fehler==0)
{
cout<<"Server hat die Verbindung getrennt..\n";
Schleife=false;
}
if(fehler==SOCKET_ERROR)
{
cout<<"Fehler: recv, fehler code: %d\n"<<WSAGetLastError();
Schleife=false;
}
}
else if(name=="c_connect")
{
if(fehler==SOCKET_ERROR)
{
cout<<"Fehler: connect gescheitert, fehler code: %d\n"<<WSAGetLastError();
}
else
{
cout<<"Verbunden\n";
}
}
}

INET()
{
cout<<"Klasse Socket erstellt";
Schleife=true;
}

~INET()
{
cout<<"Klasse Socket beendet";
closesocket(connectedSocket);
closesocket(acceptSocket);
WSACleanup();
}

};

///////////////////////////////////////////////////////////////////////////////////////////////
int main()


{


INET Server; ///Ein Beispiel wie ich den Server programiert habe
Server.start_winsock();
Server.socket_erstellen();
Server.server_socket_binden(12345);
Server.server_listen_modus();
Server.server_connect();

while(Server.check_schleife())
{
char puffer[100];
Server.daten_empfangen(puffer);
cout<<"Empfangen: "<<puffer;
}

cout<<"ENDE";

}
 
  • C++ Socket Beitrag #2
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Was mir als erstes ins Auge gesprungen ist, ist folgendes:
Code:
if(name=="start_winsock")
Das geht schief, da name vom Typ char* ist. Damit vergleichst Du 2 Pointer, was ziemlich wahrscheinlich nicht das ist, was Du wolltest. Richtig wäre
Code:
if (strcmp(name, "start_winsock") == 0)
Oder Du machst name zu einem (C++-) string. Ist in der Standard-Bibliothek oder STL definiert. Dann funktioniert der direkte Vergleich per ==.

Außerdem benutzt Du die Fehlerbehandlungsroutine mal zum Loggen und mal zum Ausgeben von Fehlern. Zum Loggen würde ich eine extra Klasse oder Funktion verwenden. Für die Behandlung der Fehler schau Dir mal die Exceptions an. Die sind genau dafür da.

Und die Formatierung ist grausam. Keine Leerzeichen, keine Einrückungen, kaum Kommentare...
 
  • C++ Socket Beitrag #3
Matyr

Matyr

Bekanntes Mitglied
Dabei seit
09.03.2007
Beiträge
428
Reaktionspunkte
0
Ok, dann fange ich mal an zu überarbeiten

aber was meinst du mit einrücken?
 
  • C++ Socket Beitrag #4
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
aber was meinst du mit einrücken?
Damit meine ich, daß man Blöcke immer einrücken sollte, damit man die Struktur des Codes einfacher erkennt. Ich vermute mal, daß das QUOTE die Einrückung kaputtgemacht hat. Deshalb sollte Code immer mit CODE (die Raute) gepostet werden.

Also so:
Code:
void fehler_behandlung(char* name)
{
    if(name == "start_winsock")
    {
        if (fehler != 0)
        {
            cerr << "Fehler: start_winsock , fehler code: \n" << fehler;
        }
        else
        {
            cerr << "Winsock gestartet!\n";
        }
    }
    ...
Nächster Punkt:
Du hast alles in eine einzige Datei gepackt. Normalerweise trennt man auch bei C++ die Header von der Implementation. In den Header (xxx.h) kommt nur die Klassendeklaration. Die Implementation kommt in das zugehörige xxx.cpp.

Ein einfaches Beispiel mit nur einer Methode:
Code:
xxx.h

class INET
{
    void fehler_behandlung(char* name);
}


xxx.cpp

#include "xxx.h"

void INET::fehler_behandlung(char* name)
{
    if(name == "start_winsock")
    {
        if (fehler != 0)
        {
            cerr << "Fehler: start_winsock , fehler code: \n" << fehler;
        }
        else
        {
            cerr << "Winsock gestartet!\n";
        }
    }
    ...
}
 
  • C++ Socket Beitrag #5
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
Zur lesbarkeit logische Blöcke einrücken, z.B.

Code:
    void fehler_behandlung(char* name) {
    if(name=="start_winsock") {
        if(fehler!=0) {
            cerr<<"Fehler: start_winsock , fehler code: \n"<<fehler;
        }
        else {
             cerr<<"Winsock gestartet!\n";
        }
    } else if {
        ...
    }
}

//edit: da warst du wohl schneller, UZ ;) lg
 
  • C++ Socket Beitrag #6
Matyr

Matyr

Bekanntes Mitglied
Dabei seit
09.03.2007
Beiträge
428
Reaktionspunkte
0
Bei mir auf dem Bildschirm war das so kp wieso der das nicht übernommen hat
 
  • C++ Socket Beitrag #7
C

cc_ip

Bekanntes Mitglied
Dabei seit
08.03.2007
Beiträge
214
Reaktionspunkte
0
da guck ich nach nen halben jahr mal wieder rein und was sehe ich, immernoch die gleichen naps wie davor -.-
 
  • C++ Socket Beitrag #8
Matyr

Matyr

Bekanntes Mitglied
Dabei seit
09.03.2007
Beiträge
428
Reaktionspunkte
0
lol
sehr freundlich
 
Thema:

C++ Socket

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben