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

1

19.05.2006, 20:33

Prob bei Broadcast mit WinSock

Hi,

ich schreib zur Zeit ein Programm, dass beim Start einen Broadcast rauschickt um zu schauen ob bereits Server da sind, wenn nicht wartet es selber auf Anfragen.

Das funktioniert auch schon ganz gut, allerdings nur bei mir Zuhause im LAN.
An meiner Schule geht es allerdings nicht, wir haben aber auch nur normales Ethernet und da müsste ein Broadcast ja problemlos geschickt werden können oder?
Außerdem haben wir ein kleines NetTetris Game, das mit Sicherheit auch Broadcasts verwendet und auch funktioniert.
Weiß jemand woran das liegen könnte?

Noch ein bisschen Code, die Funktionen sind allerdings noch in der experimentiellen Phase, da das mein erstes WinSock Programm ist :)

Quellcode

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
int CGame::FindPlayer()
{
    //Broadcast rauschicken     
    
    m_Socket = socket(AF_INET,SOCK_DGRAM,0); //Scoket für UDP erzeugen

    int Broadcast=TRUE;

    setsockopt(m_Socket, SOL_SOCKET, SO_BROADCAST,(char*)(&Broadcast),sizeof(int)); 

    SOCKADDR_IN Addr;
    Addr.sin_family=AF_INET;
    Addr.sin_port= htons(PORT);
    Addr.sin_addr.s_addr=INADDR_BROADCAST; 
    
    if(sendto(m_Socket, "hallo", 5,0,(SOCKADDR*)(&Addr),sizeof(SOCKADDR_IN)) <= 0) //Und ab mit dem Broadcast
        return -1;

    return 0;
}

//Wird als Thread aufgerufen und wird später die Nachrichtenfunktion

int CGame::NetworkMessageProc()
{
    //Auf Broadcast warten

    m_Socket = socket(AF_INET,SOCK_DGRAM,0); //Scoket für UDP erzeugen

    SOCKADDR_IN Addr;
    Addr.sin_family=AF_INET;
    Addr.sin_port= htons(PORT);
    Addr.sin_addr.s_addr=ADDR_ANY;
    
    char buffer[255];
    ZeroMemory(buffer, 255);
    bind(m_Socket, (sockaddr*)&Addr, sizeof(Addr));
    
    recv(m_Socket,buffer,255,0);    

    MessageBox(NULL, "Broadcast empfangen", buffer, MB_OK); 

    return 0;   
}

Anonymous

unregistriert

2

19.05.2006, 20:55

Also ohne den Code näher zu betrachten, aber ich würde sagen das durch diese willkürlichen casts was vermasselt wird. :doubt:

3

19.05.2006, 21:07

Was meinst du genau mit willkürlichen casts?
Wie sollte ich es sonst machen?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

19.05.2006, 22:08

Ein Wunder dass das überhaupt funktioniert...

Zitat

It is used to bind to either connection-oriented (stream) or connectionless (datagram) sockets.


Außerdem:

Zitat

The recvfrom function receives a datagram and stores the source address.


Die recv ist eigentlich nur für feste Verbindungen gedacht :). Auch sollte der Port der empängt meines Wissens nach auch auf Broadcast eingestellt sein.

Die Casts dürften an und für sich korrekt sein, jedoch solltest du dir nur eine Schreibweise angewöhnen, um die Verwirrung nicht zu erhöhen :).

Von Prinzip her ist Netzwerkprogrammierung einfach, aber leider steckt der Teufel im Detail und man muss viele Eventualitäten beachten. Vielleicht hilft es dir ja eine schon bestehende Netzwerk Lib mal anzuschauen...
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.

5

26.05.2006, 10:06

Hi,

also ich habe jetzt recvfrom verwendet und es funktioniert einwandfrei!
Danke nochmal für die Antworten :)

Starship

Werbeanzeige