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

21

15.01.2010, 23:01

danke erstmal an alle, der gg multiplayer nimmt gestalt an. man kann schon mit bis zu 8 spielern durch ein level hüpfen; allerdings noch nicht mehr. spielmodi fehlen noch (deathmatc, capture the flag, race usw.). menüs muss ich auch noch machen, genauso wie das Abfangen von membern die das game verlassen haben.

schade, dass das mit der broadcast-adresse doch nicht so einfach ist.


Zitat von »"David_pb"«

Wenn Ip(v4) + Netzmaske bekannt ist...


Wie bekomme ich die subnetmaske? Gibts da ne windows-funktion?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

22

15.01.2010, 23:30

Ja, du kannst die Interfaces abfragen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
bool GetBroadcastAddress( const char* ip, u_long* bcaddr )
{
    assert( ip != 0 && "invalid ip" );
    assert( bcaddr != 0 && "bcaddr mustn't be null" );

    in_addr addr;
    u_long broadcast = 0;

    if ( !inet_pton( AF_INET, ip, &addr ) ) {
        return false;
    }

    SOCKET socket = WSASocket( AF_INET, SOCK_DGRAM, 0, 0, 0, 0 );
    if ( socket == SOCKET_ERROR ) {
        return false;
    }

    INTERFACE_INFO ifaces[16];
    DWORD bytesReturned;
    if ( WSAIoctl( socket, SIO_GET_INTERFACE_LIST, 0, 0, &ifaces, sizeof( ifaces ),
        &bytesReturned, 0, 0 ) != SOCKET_ERROR )
    {
        int size = bytesReturned / sizeof( INTERFACE_INFO );
        for ( int i = 0; i < size; ++i )
        {
            sockaddr_in* pAddr = ( sockaddr_in* )&ifaces[i].iiAddress.Address; /* ipv4 */
            if ( pAddr->sin_addr.s_addr == addr.s_addr ) 
            {
                u_long mask = ifaces[i].iiNetmask.AddressIn.sin_addr.s_addr;
                u_long networkid = pAddr->sin_addr.s_addr & mask;
                broadcast = networkid | ~mask;
                break;
            }
        }
    }

    return broadcast != 0 && ( ( *bcaddr = broadcast ), 1 );
}

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

23

15.01.2010, 23:53

Was spricht gegen das Senden auf allen Interfaces?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

24

15.01.2010, 23:57

Zitat von »"Nox"«

Was spricht gegen das Senden auf allen Interfaces?


Nichts konkretes.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

25

15.01.2010, 23:59

Also. Warum dann was kompliziertes wenn INADDR_BROADCAST so einfach ist?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

26

16.01.2010, 00:08

Zitat von »"Nox"«

Also. Warum dann was kompliziertes wenn INADDR_BROADCAST so einfach ist?


perfekt jetzt klappt auch das. hab vorhin vergessen den winsocks header zu includen :lol:
ok, jetzt dürften keine schweren probs mehr auftreten, dankeschön. :D
gruß fred

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

27

16.01.2010, 00:12

Zitat von »"Nox"«

Also. Warum dann was kompliziertes wenn INADDR_BROADCAST so einfach ist?


Weiß ich nicht? Ich hab nur erwähnt, dass wenn man nicht auf alle Interfaces senden will man die Adresse entsprechend aufbauen muss. Es kann ja durchaus sein das man genau ein Interface ansprechen will weil [übertreibung] die anderen in hochsensiblen Netzwerken hängen wo kein überflüssiger Traffic auftreten darf [/übertreibung], oder als welchem Grund auch immer.

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

28

16.01.2010, 18:07

mal ne frage zu dem Thema kann man daten nur mit chars übertragen, also wenn ich jetzt ne spielerposition übertragen möchte dann schreib ich dort z.B. x= 1, y = 10 rein und dann muss ich es beim empfangen wieder filtern? Oder geht des auch anders?
New Project: Operation CityRacer

29

16.01.2010, 18:09

Achtung: Gefährliches Halbwissen bitte korrigiert mich, wenn quatsch. ;)
geht natürlich auch mit void*

Der Grund warum char verwendet wird, ist, dass ein char genau 1 Byte gross ist.

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

30

16.01.2010, 19:04

also wenn ich jetzt xposi und yposi übertragen will dann mach ich einfach:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
float xpos = 10,ypos = 10;
void * blabla = xpos;
void * blabla2 = ypos;


send (
  meinSocket,              
  blabla,  
  sizeof(blabla), // keine ahnung was ich da angeben muss              

  flags           // irgendwelche flags   

);
send (
  meinSocket,              
  blabla2,  
  sizeof(blabla2), // keine ahnung was ich da angeben muss              

  flags           // irgendwelche flags   

);


wäre das so in ungefähr richtig? oder grotten falsch?
New Project: Operation CityRacer

Werbeanzeige