Senden mit TcpSockets

Alles rund um die Programmierung mit Qt
Antworten
Hannes W
Beiträge: 8
Registriert: 21. April 2009 10:43

Senden mit TcpSockets

Beitrag von Hannes W »

hallo Leute

ich habe bei meinem Projekt folgendes Problem :

ich versuche mit einem Client einem Server daten zu senden mit dem code :

QString Nachricht;
QDataStream Send(&TcpSocket);
Send.setVersion(QDataStream::Qt_4_4);
Nachricht = "Hallo";
Send << Nachricht ;

der Server bekommt den Befehl zwar aber wenn ich mir den dann Ausgeben lasse ist der leer.

hat jemand eine Idee vodran das liegen könnte ?

LG Hannes
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

der Server bekommt den Befehl zwar aber wenn ich mir den dann Ausgeben lasse ist der leer.
Dann ist es doch ein Problem des Servers, und der Servercode ist hier nicht dabei...
Hannes W
Beiträge: 8
Registriert: 21. April 2009 10:43

Beitrag von Hannes W »

achso
also kann der Server nichts mit den gesendeten Daten anfangen und sie nicht auslesen ?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das weis ich nicht, ich kenne deinen Server ja immer noch nicht.
Hannes W
Beiträge: 8
Registriert: 21. April 2009 10:43

Beitrag von Hannes W »

[code]
#include <windows.h>
#include <winsock2.h>
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <fstream>
#include <string>
#include <sstream>
#include <fstream>
#include <iostream.h>
#include <iomanip>


#define MAX_CLIENTS 100
using namespace std;


/*Globale Variablen*/
/*Globale Variablen END*/

//Versuche zur neuen Benutzerverwaltung START


struct benutzer
{
int id;
string pw;
string uname;
int status;
int client_id;
};
//Versuche zur neuen Benuzterverwaltung END

int startWinsock(void) //Winsocks initalisieren
{
WSADATA wsa;
return WSAStartup(MAKEWORD(2,0),&wsa);
}
void IntToString(int i, char* buffer)
{
sprintf(buffer, "%d", i);
}
int main()
{
bool login[MAX_CLIENTS]; //Variable zur Überprüfung des Loginstatuses
for(int login_i=0;login_i<=MAX_CLIENTS; login_i++){login[login_i]=false;} //login komplett auf false setzen
char buf[300]; //Variable für die eingehenden Nachrichten
char befehl[300]; //Variable für den eingehenden Befehl
int count = 0; //Hilfs-Laufzeitvariable
int i; //Hilfs-Laufzeitvariable
string datensatz; //Hilfsvariable um die Benutzerdaten auszulesen
int userid; // - " " -
struct benutzer user[MAX_CLIENTS]; //Beinhaltet die Userdaten

long rc;
SOCKET acceptSocket;
SOCKADDR_IN addr;FD_SET fdSet;
SOCKET clients[MAX_CLIENTS]; //Enthält den jeweiliegen zustande des clients i



ifstream in("user.dat"); //Die benutzerdatei Einlesen
int init_status_i;
for(init_status_i=0; init_status_i<=100;init_status_i++)
{
user[init_status_i].status=0;
}
while(getline(in, datensatz, ':'))
{//Benutzerdatei einlese und in user[x][y] schreiben Anfang
if(count==0){
userid = atoi (datensatz.c_str());
}
switch(count)
{
case 0:
user[userid].id=userid;
break;
case 1:
user[userid].uname=datensatz;
break;
case 2:
user[userid].pw=datensatz;
break;
case 3:
count=-1;
break;
}
count++;
}//Benutzerdatei einlese ende.
cin.get();
cout << user[2].id << endl;
cout << user[2].pw << endl;
cout << user[2].uname << endl;
cout << user[2].status << endl;
cin.get();
// Winsock starten
rc=startWinsock();
if(rc!=0)
{
cout << "Fehler: startWinsock, fehler code: "<< rc << endl;
}
else
{
cout << "Winsock gestartet!" << endl;
}

// Socket erstellen
acceptSocket=socket(AF_INET,SOCK_STREAM,0);
if(acceptSocket==INVALID_SOCKET)
{
cout << "Fehler: Der Socket konnte nicht erstellt werden, fehler code: " << WSAGetLastError() << endl;
return 1;
}
else
{
cout << "Socket erstellt!" << endl;
}

// Socket binden
memset(&addr,0,sizeof(SOCKADDR_IN));
addr.sin_family=AF_INET;
addr.sin_port=htons(5432); // Angabe des Ports
addr.sin_addr.s_addr=INADDR_ANY;
rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
if(rc==SOCKET_ERROR)
{
cout << "Fehler: bind, fehler code: " << WSAGetLastError() << endl;
return 1;
}
else
{
cout << "Socket an port 5432 gebunden" << endl;
}

// In den listen Modus wechseln.
//Auf eingehende Verbindungen warten.
rc=listen(acceptSocket,10);
if(rc==SOCKET_ERROR)
{
cout << "Fehler: listen, fehler code: " << WSAGetLastError() << endl;
return 1;
}
else
{
cout << "acceptSocket ist im listen Modus" << endl;
}
//clients array auf INVALID_SOCKET setzen
//invalid_socket entspricht keiner Verbindung.
for(i=1;i<MAX_CLIENTS;i++)
{
clients[i]=INVALID_SOCKET;
}

while(true) // Endlosschleife
{
FD_ZERO(&fdSet); // Inhalt leeren
FD_SET(acceptSocket,&fdSet); // Den Socket der verbindungen annimmt hinzufügen

// alle gültigen client sockets hinzufügen (nur die die nicht INVALID_SOCKET sind)
for(i=1;i<MAX_CLIENTS;i++)
{
if(clients[i]!=INVALID_SOCKET)
{
FD_SET(clients[i],&fdSet);
}
}
rc=select(0,&fdSet,NULL,NULL,NULL);
if(rc==SOCKET_ERROR)
{
cout << "Fehler: select, fehler code: " << WSAGetLastError() << endl;
return 1;
}

// acceptSocket is im fd_set? => verbindung annehmen (sofern es platz hat)
if(FD_ISSET(acceptSocket,&fdSet)) {
// einen freien platz für den neuen client suchen, und die verbingung annehmen
for(i=1;i<MAX_CLIENTS;i++)
{
if(clients[i]==INVALID_SOCKET)
{
clients[i]=accept(acceptSocket,NULL,NULL);
cout << "Neuen Client angenommen ("<< i << ")" << endl;
break;
}
}
}


// prüfen wlecher client sockets im fd_set sind
for(i=1;i<MAX_CLIENTS;i++)
{
if(clients[i]==INVALID_SOCKET)
{
continue; // ungültiger socket, d.h. kein verbunder client an dieser position im array
}
if(FD_ISSET(clients[i],&fdSet))
{
rc=recv(clients[i],buf,256,0);
// prüfen ob die verbindung geschlossen wurde oder ein fehler auftrat
if(rc==0 || rc==SOCKET_ERROR)
{
cout << "Client " << i <<" hat die Verbindung geschlossen" << endl;
login[i]=false; // Benutzer ausloggen
closesocket(clients[i]); // socket schliessen
clients[i]=INVALID_SOCKET; // seinen platz wieder freigeben
}
else
{
buf[rc]='\0'; // Buffer für eingehende befehle lehren
//Befehl auslesen und in befehl[] schreiben
for(count=0; count<=256; count++)
{
befehl[count] = buf[count];
if(buf[count]==' ')
{
befehl[count]='\0';
break;
}
}
//Befehl auslesen END
//login START
if(befehl[0]=='l'&&befehl[1]=='o'&&befehl[2]=='g'&&befehl[3]=='i'&&befehl[4]=='n')
{
//Parameter abtrennen
char par1[256];
char par2[256];
int par1_i,bla;
int par2_i;
int a;
for(par1_i=count+1,bla=0;par1_i<=256;par1_i++,bla++)
{
par1[bla] = buf[par1_i];
if(buf[par1_i]==' ')
{
par1[bla]='\0';
break;
}
}
bla=0;
for(par2_i=par1_i+1;par2_i<=256;par2_i++,bla++)
{
par2[bla] = buf[par2_i];
if(buf[par2_i]==' ')
{
par2[bla]='\0';
break;
}
}
//Parameter abtrennne END
//Benutzername suchen
for(a=1; a<=100; a++)
{
if(par1==user[a].uname){break;}
}
if(par2==user[a].pw)//Passwort vergleichen
{
user[a].status=1; //Status auf online setzen
user[a].client_id=i; //i in user [a][8] schreiben zur identifizierung
login[i]=true; //Benutzer einloggen
send(clients[i],"001",3,0); //Benutzer erfolgreichen login mitteilen
cout << user[a].uname << " (" << i << ") eingeloggt." << endl; // Servermeldung ausgeben

}
else{send(clients[i],"002",3,0);}//Benutzer Fehlerhaften login mitteilen

}
//login END
if(login[i]) //Befehle werden nur ausgeführt wenn der benutzer eingeloggt ist
{
if(befehl[0]=='s'&&befehl[1]=='e'&&befehl[2]=='n'&&befehl[3]=='d') //SEND
{
//Parameter abtennen
char par1[256];
char par2[256];
char par3[256];
int par1_i,bla;
int par2_i,par3_i;
for(par1_i=count+1,bla=0;par1_i<=256;par1_i++,bla++)
{
par1[bla] = buf[par1_i];
if(buf[par1_i]==' ')
{
par1[bla]='\0';
break;
}
}
bla=0;
for(par2_i=par1_i+1;par2_i<=256;par2_i++,bla++)
{
par2[bla] = buf[par2_i];
if(buf[par2_i]==' ')
{
par2[bla]='\0';
break;
}
}
bla=0;
for(par3_i=par2_i+1;par3_i<=256;par3_i++,bla++)
{
par3[bla] = buf[par3_i];
}
//Parameter abtrennen END
//Nachricht senden
//Nachricht senden
char tmpUserID[2];
IntToString(user[atoi(par1)].client_id, tmpUserID);
string nach_send = "send ";
nach_send += tmpUserID;
nach_send += " ";
nach_send += par3;
cout << nach_send;
send(clients[user[atoi(par1)].client_id],nach_send.c_str(), nach_send.length(),0); //Nachricht an Empfänger senden
cout << "Nachricht von " << par1 << " an " << par2 << endl; //Servermeldung ausgeben
cout << "Nachricht: " << par3 << endl; //Servermeldung ausgeben
send(clients[user[atoi(par2)].client_id],"026",3,0); //Bestätigung an sender senden. //Nachricht an Empfänger senden
cout << "Nachricht von " << par1 << " an " << par2 << endl; //Servermeldung ausgeben
cout << "Nachricht: " << par3 << endl; //Servermeldung ausgeben
send(clients[user[atoi(par2)].client_id],"026",3,0); //Bestätigung an sender senden.

}
//KICKUSER
if(befehl[0]=='k'&&befehl[1]=='i'&&befehl[2]=='c'&&befehl[3]=='k'&&befehl[4]=='u'&&befehl[5]=='s'&&befehl[6]=='e'&&befehl[7]=='r')
{
//Parameter auslesen:
char par1[256];
int par1_i,bla;
for(par1_i=count+1,bla=0;par1_i<=256;par1_i++,bla++)
{
par1[bla] = buf[par1_i];
if(buf[par1_i]==' ')
{
par1[bla]='\0';
break;
}
}
//Parameter auslesen ende;
send(clients[user[atoi(par1)].client_id],"051",3,0); //gekickten Benutzer informieren
send(clients[i],"052",3,0);
cout << user[atoi(par1)].uname << " (" << i << ") wurde gekickt!" << endl; //Servermeldung ausgeben
closesocket(clients[atoi(par1)]); //Socket schließen
clients[atoi(par1)]=INVALID_SOCKET; //Socket wieder freigeben

}
//get_contact START
else if(befehl[0]=='g'&&befehl[1]=='e'&&befehl[2]=='t'&&befehl[3]=='_'&&befehl[4]=='c'&&befehl[5]=='o'&&befehl[6]=='n'&&befehl[7]=='t'&&befehl[8]=='a'&&befehl[9]=='c'&&befehl[10]=='t')
{
//Parameter auslesen
char par1[5];
int par1_i=0,bla=0;
for(par1_i=count+1,bla=0;par1_i<=256;par1_i++,bla++)
{
par1[bla] = buf[par1_i];
if(buf[par1_i]==' ')
{
par1[bla]='\0';
break;
}
}
//parameter auslese ende;
int a;
char tmp[10];
for(a=1; a<=10; a++){if(i==user[a].id){break;}} //Name des Anfragers auslesen
cout << user[a].uname << " (" << i << ") fordert Daten von " << par1 << endl;//Servermeldung ausgeben
string tmp_senden;
IntToString(user[atoi(par1)].id,tmp);
tmp_senden = tmp;
tmp_senden += ":";
tmp_senden += user[atoi(par1)].uname;
tmp_senden += ":";
IntToString(user[atoi(par1)].status,tmp);
tmp_senden += tmp;
send(clients[i],tmp_senden.c_str(), tmp_senden.length(),0);

}
//get_contact END
else if(befehl[0]=='g'&&befehl[1]=='e'&&befehl[2]=='t'&&befehl[3]=='_'&&befehl[4]=='o'&&befehl[5]=='n')
{
string online = "222 ";//code tabelle fehlt
int tmp_i;
char tmp_string[2];
for(tmp_i=1; tmp_i <=100; tmp_i++)
{
if(user[tmp_i].status==0){continue;}
else if(user[tmp_i].status==1)
{
IntToString(tmp_i,tmp_string);
online += tmp_string; online +=":";
}
}
send(clients[i],online.c_str(), online.length(),0);
cout << "Client "<< i << ": fordert Onlinestatus" << endl;
}
}//if(login)....
else
{
send(clients[i],"000",3,0);
cout << "Client " << i << ": Login Fehlgeschlagen!" << endl;
clients[i]=INVALID_SOCKET;
}
}
}
}
}

}
[/code]

das ist der Server, den habe nicht ich geschrieben sondern jemand anders aus meiner Gruppe
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Also doch ein Problem des Servercodes, oder Doku von QDataStream nicht verstanden.
Hannes W
Beiträge: 8
Registriert: 21. April 2009 10:43

Beitrag von Hannes W »

ich konnte das Problem lösen :-)

anstatt
...
send << Nachricht... usw.

habe ich

TcpSocket.write(Nachricht)

genommen.

trotzdem vielen Dank für deine Antworten, jetzt muss ich nur noch das empfangen des Clients hin bekommen, das wird wohl auch noch mal ein Problem ..

Liebe Grüße
Antworten