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

11

27.09.2015, 16:48

Falsch gelesen

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »anti-freak« (27.09.2015, 17:25)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

27.09.2015, 17:59

Ne, die Stream-Operatoren funktionieren so in C++ leider nicht. Die funktionieren nur mit Textdaten und auch das eher schlecht als recht.
Was? Natürlich funktionieren Stream-Operatoren nicht nur auf Textdaten. Wer hat Dir denn so einen Unfug erzählt? Die funktionieren sogar ganz prima auf Binärdaten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

13

27.09.2015, 18:11

Also soll ich Wert nach Wert streamen anstatt mit Header-Strukturen zu arbeiten? Ich fand das so wie ich es jetzt mache einfacher.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

14

27.09.2015, 18:30

@BlueCobold
Aha? Also da habe ich andere Erfahrung gemacht.
Im Internet finde scheint auch nichts für deine Theorie zu sprechen. (siehe beispielsweise hier oder hier)

@birdfreeyahoo
Mir wäre auch keine andere Möglichkeit bekannt, unter C++ portabel binäre Daten zu lesen oder zu schreiben. Es geht auch deutlich schneller, wenn man mehr Daten auf einmal ausliest. Wenn die Anwendung auf anderen Plattformen verwendet werden soll, musst du allerdings Endianness beachten und ggf. die Bytes noch umdrehen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (27.09.2015, 18:37)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

27.09.2015, 18:41

Also soll ich Wert nach Wert streamen anstatt mit Header-Strukturen zu arbeiten?
Nein, Structs sind definitiv sinnvoller, wo sie sich einsetzen lassen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

27.09.2015, 21:50

Ich will alle IP's in einem Netz mit der Subnetzmaske 255.255.255.0 herausfinden.

Das mit den Pointern und Bytes ist – zusätzlich zu den bereits genannten Gründen – schon allein darum keine gute Idee, dass die Hostnummer in einem IP Subnetz nicht an Bytegrenzen gebunden ist. Ich würde einfach ein ICMP Echo an die Broadcastadresse des entsprechenden Subnet schicken und schauen, wer auf den Ping antwortet...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (27.09.2015, 22:02)


birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

17

28.09.2015, 04:48

Mit dem Broadcast wäre ich auch von der Subnetzmaske unabhängig, also immer 255.255.255.255 und alle würden mir ein Echo Reply schicken (im Normalfall)?

Was das mit den Pointern angeht, ich versteh nicht wie ich das anders machen soll, vielleicht kann mir hier jemand das am Beispiel zeigen:


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
39
40
41
42
43
44
45
46
47
48
49
void Pinger::PingIP(unsigned int ip)
{
    const int SIZE = sizeof(ETH_HDR) + sizeof(IP_HDR) + sizeof(ICMP_HDR);
    unsigned char aPacket[SIZE];
    ZeroMemory(aPacket, SIZE);

    ETH_HDR* eth = (ETH_HDR*)aPacket;
    IP_HDR* ip_hdr = (IP_HDR*)(aPacket + sizeof(ETH_HDR));
    ICMP_HDR* icmp = (ICMP_HDR*)(aPacket + sizeof(IP_HDR) + sizeof(ETH_HDR));

    // Get destination MAC address
    unsigned char aMAC[MAC_LEN];
    m_pCore->GetMAC(ip, aMAC);

    memcpy(eth->aDstMac, aMAC, MAC_LEN);
    memcpy(eth->aSrcMac, m_pCore->m_aLocalMAC, MAC_LEN);
    eth->PType = PROTO_IP;

    ip_hdr->Version = 4;
    ip_hdr->IHL = sizeof(IP_HDR) / sizeof(unsigned long);
    ip_hdr->DSCP = 0;
    ip_hdr->ECN = 1;
    ip_hdr->Length = htons(SIZE - sizeof(ETH_HDR));
    ip_hdr->ID = 0;
    ip_hdr->Flags = DF; // 010, DF
    ip_hdr->FragOffset = 0;
    ip_hdr->TTL = 128;
    ip_hdr->Protocol = IPPROTO_ICMP;
    ip_hdr->Checksum = 0;
    ip_hdr->SourceIP = m_pCore->m_LocalIP;
    ip_hdr->DestIP = ip;

    ip_hdr->Checksum = Checksum((unsigned short*)ip_hdr, sizeof(IP_HDR));

    icmp->Type = ICMP_ECHO;
    icmp->Code = 0;
    icmp->Checksum = 0;
    icmp->RoH = 0;

    icmp->Checksum = Checksum((unsigned short*)icmp, sizeof(ICMP_HDR));
    
    // Send packet
    if (pcap_sendpacket(m_pCore->m_pDeviceHandle, (const unsigned char*)aPacket, SIZE) != NO_ERROR)
        std::cout << "Error sending ping (icmp) packet: " << pcap_geterr(m_pCore->m_pDeviceHandle) << std::endl;
    else
    {
        pingedIPs.push_back(ip);
    }
}

Tobiking

1x Rätselkönig

  • Private Nachricht senden

18

28.09.2015, 07:36

Ich würde die Header einfach nochmal in ein struct packen:

C-/C++-Quelltext

1
2
3
4
5
6
struct COMPLETE_HEADER
{
    ETH_HDR eth;
    IP_HDR ip;
    ICMP_HDR icmp;
};


Die Daten liegen dann genau so im Speicher wie bei dem Array (evtl. struct padding deaktivieren) mit dem Unterschied das du vom Compiler die Adressen bekommst statt sie manuell zu berechnen.

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

19

28.09.2015, 15:04

Ok ja das hört sich gut an, danke für den Hinweis. Padding ist übrigens deaktiviert.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

20

28.09.2015, 16:47

Eigentlich sollte es Funktionen geben, die das Auseinandernehmen und Zusammensetzen fuer dieses IP Zeug tun. Die sollte man dann auch tunlichst benutzen, allein schon damit der Code etwas leserlicher wird. Hier waere evtl. ein Einstieg dazu: http://www.retran.com/beej/ipstructsdata.html

Werbeanzeige