CAsyncSocket::ReceiveFrom


  • Administrator

    Grüsse zusammen,

    Hab jetzt endlich so einiges hinbekommen und bin glaub ich kurz davor ein Ping/Echo Programm schreiben zu können. Allerdings habe ich noch ein zwei Verständnisfragen und ein Problem, welche mir hoffentlich erklärt werden können.

    Ich erstelle ein SOCK_DGRAM Socket und sende mit SendTo 32 Byte Daten zu irgendeiner IP-Adresse. Hier kommt eigentlich schon die erste Frage:
    Beim Echo/Ping werden diese Daten zurückgesandt, wieso? Bzw. wieso weiss die Maschine oder was auch immer an der anderen Adresse, dass die Daten zurückgesendet werden sollen? Passiert dies automatisch?
    Es scheint jedenfalls automatisch zu geschehen, denn kurz darauf, wenn die IP gültig ist, bekomme ich ein OnReceive Ereignis in meiner von CAsyncSocket abgeleiteten Klasse. Also habe ich dort ein ReceiveFrom eingefügt umd die Daten auszulesen. Doch hier wird mir dann immer ein SOCKET_ERROR zurückgegeben. Wenn ich sofort danach GetLastError (oder WSAGetLastError) aufrufe, gibt der mir 0 zurück. Das würde ja dann bedeuten, dass alles einwandfrei funktioniert hat, was aber eben nicht der Fall ist. Hat einer eine Idee? 😃

    Womöglich mache ich auch was komplett falsch, bin immer noch völlig unerfahren in dieser Netzwerk/Internet Programmierung ^^

    Grüssli und danke im voraus.



  • Dravere schrieb:

    Beim Echo/Ping werden diese Daten zurückgesandt, wieso? Bzw. wieso weiss die Maschine oder was auch immer an der anderen Adresse, dass die Daten zurückgesendet werden sollen? Passiert dies automatisch?

    ja. parallel zu udp und tcp haben die meisten kisten noch icmp (internet control message protocol). wenn man dem ein echo-request schickt (mit dem ping programm) dann schicken die's zurück. geht alles automnatisch.
    vielleicht interessiert dich das: http://www.c-worker.ch/winsock/ping.cpp


  • Administrator

    Kenne ich schon. Ist aber leider alles mit der WinSock2 API gemacht. Ich probier das irgendwie mit der MFC hinzubiegen ^^

    Hmmm sorry wenn ich jetzt Frage, aber ich habe echte mühe mit dem ganzen Zeugs, da mir irgendwie gewisse Sachen nirgends beantwortet werden.

    Wenn ich jetzt per UDP Daten an eine IP sende, werden die automatisch zurückgesendet? Oder müssen diese Daten einer bestimmten Struktur entsprechen um ein Echo zu erzeugen? Wenn sie einer bestimmten Struktur enstprechen müssen, dann hätte ich gerne mal eine sinnvolle Erklärung wie die Struktur aussehen muss, welche gesendet und die welche bekommen wird.

    Zudem was ist immer dieses SOCK_RAW. Ich kann mit der MFC-Klasse nur SOCK_STREAM und SOCK_DGRAM erzeugen, zumindest laut MSDN.

    Und dann noch die letzte Frage. Was für ein Fehler ist passiert, wenn ich bei CAsyncSocket::ReceiveFrom (oder halt recvfrom) ein SOCKET_ERROR zurückbekomme, in GetLastError aber 0 drin steht?

    Grüssli und danke!



  • hihi,

    habe soeben anhand eines tutorials begonnen mich in die materie einzuarbeiten. mein erstes problem ist die class CAsyncSocket zu bekommen.
    kann mir jemand sagen wo ich die herbekomme.
    oder vielleicht kann mir die auch jemand mailen.
    eine passende header-datei habe ich nicht gefunden.

    so wie sich das liest, ist es ja nicht ganz trivial von einer ip-adresse daten auszulesen. ich bin gespannt, wie oft ich eure hilfe hierzu noch in anspruch nehmen muss.

    lieb grüße

    andrea


  • Administrator

    Meine Fragen haben sich erübrigt. Ich habe es endlich so langsam geschnallt. Eigentlich bleibt nur noch ein Verständnisproblem mit der letzten Frage übrig, aber ich denke mal, dass es dann darauf zurückzuführen ist, dass ich das ganze ein wenig falsch benutze ^^

    Danke fürs lesen.

    @andrea19791
    CAsyncSocket ist Bestandteil der MFC. Deshalb schreib ich es ja auch ins MFC Forum.
    CAsyncSocket
    CSocket
    CSocketFile

    Grüssli



  • @andrea:
    um mit sockets zu experimentieren braucht man keine speziellen klassen. dafür reicht die gewöhnliche 'socket api'. das ist, meiner meinung nach, sogar besser wenn man erstmal lernen will wie's funktioniert. schliesslich ist 'information hiding' einer der stützpfeiler der oop und deshalb bekommt man durch die anwendung von fertigen klassen kein tiefenverständnis.

    @dravere:
    ich nehme an, die CAsyncSocket ruft selber schon 'GetLastError' auf, weshalb du 0 zurückbekommst (der errorstatus wird durch einen einmaligen aufruf wieder zurückgesetzt). bei asynchronen sockets gibt es oft 'SOCKET_ERROR' weil die operation noch nicht abgeschlossen ist (richtiger wäre ein 'SOCKET_PENDING' aber wir wollen ja nicht schon wieder über m$ meckern 😉 ). wenn du direkt nach einer nonblocking socket-aktion 'WSAGetLastError' aufrufst, solltest du ein WSAEWOULDBLOCK bekommen, was soviel heisst wie 'alles ok aber ich bin noch beschäftigt'


  • Administrator

    @net
    Wäre ja schön, wenn es denn so wäre. Ich rufe gleich, wirklich gleich, nach dem ReceiveFrom, welches SOCKET_ERROR zurückliefert, GetLastError auf. Ich habe mir den Code von ReceiveFrom angeschaut, dort drin wird nie, auch nicht in einer Unterfunktion GetLastError aufgerufen. Und laut MSDN soll man ja gleich nach dem Aufruf von ReceiveFrom GetLastError aufrufen können, wenn die Funktion SOCKET_ERROR zurückliefert. Aber es kommt immer und immer wieder nur ein 0 zurück, was soviel wie "Kein Fehler!" bedeutet. Begreif das eigentlich wirklich nicht, aber wie gesagt, ich denke mal eher, es kommt daher, dass ich in dem Programm die Socketsache noch ein wenig falsch verwende.

    Aja und noch zu deiner Aussage an andrea. CAsyncSocket ist so schlicht gehalten, dass man die Grundlage so oder so lernen muss. Oder anderst gesagt, CAsyncSocket ist fast keine Hilfe. Das einzige was es eigentlich macht, ist eine Kopplung vom Socket Handle. Man muss also nicht mehr immer das Socket übergeben bei einer Funktion, sondern die Funktion der Klasse CAsyncSocket macht das selber. Naja und dann hat es noch ein, zwei Erleichterungen in der IP Übergabe, aber das ist schon bald einmal alles.
    Aber das ist ja auch normal bei der MFC 😃

    Grüssli



  • Dravere schrieb:

    ...ich denke mal eher, es kommt daher, dass ich in dem Programm die Socketsache noch ein wenig falsch verwende.

    jo, schon komisch, finde ich auch. vielleicht kannste deinen code mal damit http://simplesamples.info/MFC/UDPSendReceive.php vergleichen...


Anmelden zum Antworten