Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Sec Junior JLI'ler
Anmeldedatum: 18.09.2002 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 19.04.2005, 15:57 Titel: send() und recv() |
|
|
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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.04.2005, 16:06 Titel: |
|
|
bei sowas hilft die MSDN sehr viel. Falls du da dann Fragen hast, gibts ja dieses Forum
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 |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 19.04.2005, 16:07 Titel: |
|
|
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 |
|
Nach oben |
|
|
Sec Junior JLI'ler
Anmeldedatum: 18.09.2002 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 19.04.2005, 16:31 Titel: |
|
|
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 |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 19.04.2005, 16:37 Titel: |
|
|
Das geht wie xarias schon sagte oft nicht gut
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 |
|
|
Sec Junior JLI'ler
Anmeldedatum: 18.09.2002 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 19.04.2005, 16:43 Titel: |
|
|
gibs noch andere möglichkeiten? _________________ MFG Sec |
|
Nach oben |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 19.04.2005, 16:45 Titel: |
|
|
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 |
|
|
Sec Junior JLI'ler
Anmeldedatum: 18.09.2002 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 19.04.2005, 17:01 Titel: |
|
|
ahso yep soll nur win2win
danke an alle _________________ MFG Sec |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.04.2005, 17:02 Titel: |
|
|
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 |
|
|
Mazze JLI'ler
Alter: 39 Anmeldedatum: 02.01.2004 Beiträge: 145
Medaillen: Keine
|
Verfasst am: 19.04.2005, 17:12 Titel: |
|
|
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 |
Wie xardi schon sagte, verschickt besser keine structs 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 ). |
|
Nach oben |
|
|
Sec Junior JLI'ler
Anmeldedatum: 18.09.2002 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 19.04.2005, 17:22 Titel: |
|
|
Die daten gehen an denn server, ich versuch ein mutiplayer spiel zu machen wie WoW (lol) _________________ MFG Sec |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.04.2005, 17:24 Titel: |
|
|
Sec hat Folgendes geschrieben: | Die daten gehen an denn server, ich versuch ein mutiplayer spiel zu machen wie WoW (lol) |
??? Cool... Benutzte dabei DirectPlay? Oder solls net übers internet gehen? |
|
Nach oben |
|
|
Sec Junior JLI'ler
Anmeldedatum: 18.09.2002 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 19.04.2005, 17:37 Titel: |
|
|
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 |
|
|
Sec Junior JLI'ler
Anmeldedatum: 18.09.2002 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 19.04.2005, 17:42 Titel: |
|
|
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 |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 19.04.2005, 17:47 Titel: |
|
|
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 |
|
|
|