JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

send() und recv()
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Sec
Junior JLI'ler



Anmeldedatum: 18.09.2002
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 15:57    Titel: send() und recv() Antworten mit Zitat

Kann man mit der send() funktion nur strings senden?
was muss ich machen wenn ich z.b. ne position senden will also ne:

Code:

struct SPos
{
   int m_PosX;
   int m_PosY;
   int m_PosZ;
};

Soll ich die Positionen in einen string speichern und dann mit atoi() wieder in eine int?
_________________
MFG Sec
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 16:06    Titel: Antworten mit Zitat

bei sowas hilft die MSDN sehr viel. Falls du da dann Fragen hast, gibts ja dieses Forum Wink

z.B. bei send:
MSDN hat Folgendes geschrieben:
The Windows Sockets send function sends data on a connected socket.

int send (
SOCKET s,
const char FAR * buf,
int len,
int flags
);

Parameters
s
[in] A descriptor identifying a connected socket.
buf
[in] A buffer containing the data to be transmitted.
len
[in] The length of the data in buf.
flags
[in] An indicator specifying the way in which the call is made.
Remarks
The send function is used to write outgoing data on a connected socket. For message-oriented sockets, care must be taken not to exceed the maximum packet size of the underlying provider, which can be obtained by using getsockopt to retrieve the value of socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned, and no data is transmitted.

The successful completion of a send does not indicate that the data was successfully delivered.

If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in a nonblocking mode. On nonblocking stream oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both client and server machines. The select, WSAAsyncSelect or WSAEventSelect functions can be used to determine when it is possible to send more data.

Calling send with a zero len parameter is permissible and will be treated by implementations as successful. In such cases, send will return zero as a valid value. For message-oriented sockets, a zero-length transport datagram is sent.

The flags parameter can be used to influence the behavior of the function beyond the options specified for the associated socket. The semantics of this function are determined by the socket options and the flags parameter. The latter is constructed by or-ing the following values:

Value Meaning
MSG_DONTROUTE Specifies that the data should not be subject to routing. A Windows Sockets service provider can choose to ignore this flag.
MSG_OOB Send out-of-band data (stream-style socket such as SOCK_STREAM only. Also see DECnet Out-Of-band data for a discussion of this topic).


Windows CE: For IrSockets implementation, the Af_irda.h file must be explicitly included.



Gruß DirectXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 16:07    Titel: Antworten mit Zitat

theoretisch könnte man hingehen und den struct casten:
Code:

struct SPos
{
   int m_PosX;
   int m_PosY;
   int m_PosZ;
};

//...
SPos test;
char buffer[sizeof(SPos)];
memcpy( buffer, &test, sizeof(SPos) );

jedoch gibt es da probleme, da strukturen je nach compiler unterschiedliche größen haben.
Ich denke mal, dass du visual C++ benutzt. dann kannst du folgendes schreiben:
Code:

#pragma pack(1)
struct SPos
{
   int m_PosX;
   int m_PosY;
   int m_PosZ;
};


dies weist den compiler an die struktur wirklich in der größe zu speichern die sie hat. (aus opimierungsgründen werden die strukturen oft 4 byte aligned gespeichert. heißt struct{ char test; } hätte die größe 4 byte.)
Wenn du die sachen über verschiedene betriebsysteme verschicken möchtest, musst du jedoch einen anderen weg gehen.

Bitte korregiert mich wenn ich falsch liege. netzwerk kram ist mazzes gebiet in unserem spiel Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sec
Junior JLI'ler



Anmeldedatum: 18.09.2002
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 16:31    Titel: Antworten mit Zitat

hmm ich glaub ich hab ne bessere möglichkeit gefunden
CPP:
// Send
int Pos = 255; // Position
send(Socket, (char*)&Pos, sizeof(int), 0);

//..
//..
//..

// Recv
int Pos = 0;
recv(Socket, (char*)&Pos, sizeof(int), 0);

die Position wurde richtig versendet (also der wert ist immernoch 255)

ich versuch mal klassen zu senden
_________________
MFG Sec
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
abc_d
JLI Master Trainee


Alter: 34
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 16:37    Titel: Antworten mit Zitat

Das geht wie xarias schon sagte oft nicht gut Wink

Zumindest unter Unix, C++Builder hatte unter Windows keine Probleme.
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sec
Junior JLI'ler



Anmeldedatum: 18.09.2002
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 16:43    Titel: Antworten mit Zitat

Crying or Very sad gibs noch andere möglichkeiten?
_________________
MFG Sec
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
abc_d
JLI Master Trainee


Alter: 34
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 16:45    Titel: Antworten mit Zitat

Wir waren uns eigentlich einig das serialize das beste ist (mazze hat da was geschrieben). Wie gesagt wenn du nur unter win2win senden willst gibt es kein Problem, nur bei Unix Programmen, insbesondere mit dem gcc muss man padding bytes berücksichtigen.
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sec
Junior JLI'ler



Anmeldedatum: 18.09.2002
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:01    Titel: Antworten mit Zitat

ahso Exclamation yep soll nur win2win
danke an alle Very Happy
_________________
MFG Sec
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:02    Titel: Antworten mit Zitat

Sec hat Folgendes geschrieben:
hmm ich glaub ich hab ne bessere möglichkeit gefunden
CPP:
// Send
int Pos = 255; // Position
send(Socket, (char*)&Pos, sizeof(int), 0);

//..
//..
//..

// Recv
int Pos = 0;
recv(Socket, (char*)&Pos, sizeof(int), 0);

die Position wurde richtig versendet (also der wert ist immernoch 255)

ich versuch mal klassen zu senden


Ich glaube, dass das net so gut gehen würde...
Du hast doch in deiner struct 3 integer, oder? Müsstest du net eigentlich 3 * sizeof(int) oder sizeof(Pos) nehmen? Naja, is auch egal.

Wohin möchtest du das denn senden?

Gruß DirectXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Mazze
JLI'ler


Alter: 39
Anmeldedatum: 02.01.2004
Beiträge: 145

Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:12    Titel: Antworten mit Zitat

xardias hat Folgendes geschrieben:

dies weist den compiler an die struktur wirklich in der größe zu speichern die sie hat. (aus opimierungsgründen werden die strukturen oft 4 byte aligned gespeichert. heißt struct{ char test; } hätte die größe 4 byte.)
Wenn du die sachen über verschiedene betriebsysteme verschicken möchtest, musst du jedoch einen anderen weg gehen.

Bitte korregiert mich wenn ich falsch liege. netzwerk kram ist mazzes gebiet in unserem spiel Wink


Wie xardi schon sagte, verschickt besser keine structs Wink Die beste Lösung imo ist wie BLD sagte den Kram zu Serialisieren. D.h. im wesentlichen nur: Nehmt alle Variablen der Klasse/Struct, castet sie in nen char *, und versendet den (d.h. nicht sie in einen string zu schreiben, was natürlich auch gehen würde Wink).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sec
Junior JLI'ler



Anmeldedatum: 18.09.2002
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:22    Titel: Antworten mit Zitat

Die daten gehen an denn server, ich versuch ein mutiplayer spiel zu machen wie WoW (lol) Wink
_________________
MFG Sec
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:24    Titel: Antworten mit Zitat

Sec hat Folgendes geschrieben:
Die daten gehen an denn server, ich versuch ein mutiplayer spiel zu machen wie WoW (lol) Wink


??? Cool... Benutzte dabei DirectPlay? Oder solls net übers internet gehen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sec
Junior JLI'ler



Anmeldedatum: 18.09.2002
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:37    Titel: Antworten mit Zitat

also das mit wow war nur spass ich versuch ein einfaches mutliplayer spiel zu machen (2d jump and run)

ich benutzte kein directplay sondern winsock, übers internet muss es auch gehen (man braucht ja nur die ip und den port um zu connecten
_________________
MFG Sec
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sec
Junior JLI'ler



Anmeldedatum: 18.09.2002
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:42    Titel: Antworten mit Zitat

ahja noch ne frage, wie soll ich den char buffer zurück casten

CPP:
//Send
int Wert01 = 100;
char BWert01[sizeof(int)];
memcpy(BWert01, &Wert01, sizeof(int));
send(ClientSocket, BWert01, sizeof(int), 0);

//...

//Recv
int Wert01 = 0;
char BWert01[sizeof(int)];
recv(ConnectSocket, BWert01, sizeof(int), 0);
Wert01 = (int)BWert01;
// habs so versucht aber da kommen falsche werte lol

_________________
MFG Sec
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
abc_d
JLI Master Trainee


Alter: 34
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:47    Titel: Antworten mit Zitat

Wenn du winsocks verwendest kannst du das doch sowieso nur unter Windows verwenden? Dann musst du das nicht machen.

Ansonsten frag mal mazze ob er dir den Code gibt.
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling


Zuletzt bearbeitet von abc_d am 19.04.2005, 17:51, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum