Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

1

15.08.2004, 14:08

Socketprogrammierung - Send - Strukturen

Hi,

ich beschäftige mich seit geraumer zeit mit socketprogrmmaierung und habe ienen kleinen chat geschrieben, basierend auf den mfc und winsock. meine sockets sind alle von CAsyncSocket abgeleitet. funktioniert auch alles einwandfrei.
bisher versende ich "nur" strings. um jedoch speziell auf verschieden nachrichten z ureagieren, wäre es gut ein paar streuzeichen u zu haben. natürlcih könnte man zB. die ersten beiden zeichen des strings dafür benutzen und im rest ist die nachricht.
allerdings wäre es doch elleganter sich ne nachrichten-struktur zu definieren und dies dann zu verschicken. ist sowas irgendwie möglich?? oder muss man zwangsweise strings versenden??

danke. dave.

2

15.08.2004, 15:17

"Streuzeichen" ? Kannst ja deine Buchstabensuppe auf der Wiese verteilen ;D

Scherz beiseite. Natürlich kann man auch Daten verschicken. Allerdings hab ich keine Ahnung wie die MFC-Funktionen für WinSock aufgebaut sind. Bei den "echten" WinSock-Funktionen wird nur ein char* benutzt weil man übers netzt immer nur Bytes versendet. Halt wie bei Dateien.

Du kannst es ja so aufbauen das du immer ein Steuerzeichen sendest und danach die Daten. Damit der String keine max. Länge bekommt.

Z.B.
1 == String wird gesendet
2 == Bann
...

Oder du bastelst dir, wie schon gesagt eine Struktur, die etwa so aufgebaut sein kann.

C-/C++-Quelltext

1
2
3
4
5
6
7
struct NetPackage
{
    long lType;
    long lPackageCount;
    long lPackageNumber;
    char cData[4096];
};

lType gibt dabei an, um was für eine Message es sich handelt. Z.B die Zahlen von oben. Und in cData sind die Daten dann erhalten.
Im Falle das mehrere Packete zusammen gehören, benutzt man lPackageCount und lPackageNumber, die das wievielte Packet von wievielen angeben.

Einfacher wäre es natürlich wenn du deine Steuerzeichen einfach als String speicherst. Z.B. mit {B}:[Name] ( {B}:BadMan - Kicked den User mit namen BadMan ). Oder so ähnlich.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

3

15.08.2004, 17:28

die send funktion ist in den mfc folgendermaßen definiert:

Quellcode

1
2
3
4
5
virtual int Send(
   const void* lpBuf,
   int nBufLen,
   int nFlags = 0 
);


wie funktioniert es denn, wenn ich daten versenden möchte? ich hatte mir das so ähnlich mit der struktur gedacht, wie du das jetzt beschirben hattest. allerdings werd ich aus dem "const void* lpBuf" nicht ganz schlau. wie muss ich die send-funktion aufrufen, wenn ich meine struktur versenden möchte?
rufe ich sie folgendermaßen auf:

Quellcode

1
Send(Msg, sizeof(Msg)); // Msg ist meine nachrichtenstruktur

bekomme ich folgende fehlermeldung: d:\Eigene Programme\C++\Chat\MyServer.cpp(71): error C2664: 'CAsyncSocket::Send' : Konvertierung des Parameters 1 von 'SMyMessage' in 'const void *' nicht möglich.

benötigt man noch irgendein typecasting oder so??
auf jeden fall schonmal vielen dank...

nebenbei: geile signatur (das bild) :-D

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

15.08.2004, 20:35

Send((void*)&Msg, sizeof(Msg));
Bei winsock muss es heißen:
send(socket,(char*)&Msg,sizeof(Msg));

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

5

16.08.2004, 10:30

das versenden funktioniert jetzt. vielen dank.

allerdings habe ich probleme beim empfangen... ich vermute, dass es daran liegt, dass ich ein argument vom typ cstring in meiner struktur habe und sizeof somit nicht die "echte" größe des speicherbereichs liefert, sondern nur die der adresse....
meine nachrichtenstruktur:

Quellcode

1
2
3
4
5
struct SMyMessage
{
    int m_nType;
    CString m_strText;
};


wie bekomme ich die "echte" größe meiner struktur? ich könnte natürlich auch ein char-array verwenden, allerdings müsste ich dieses dann zum weiterarbeiten in einen cstring konvertieren, womit ich momentan auch meine probleme habe.... *g*
danke nochmals..

6

16.08.2004, 13:12

Das klappt deshalb nicht weil CString intern mit einem char* Arbeitet. Du versendest also nicht deinen String sondern nur dessen Größe und die Adresse zu deinem eignetlichen String. Das kann nicht gehen. Das sollte man aber wissen. Man kann keine Pointer über das Netz verschicken!


Du must deine Struktur anders aufbauen. Wenn dein String keine max. Länge haben soll, dann must du vorher sagen, das du einen String versenden willst und wie lang er ist. Danach wird dann der eigentliche String versendet.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige