neo336 Geschrieben 2. Juni 2010 Geschrieben 2. Juni 2010 Hallo zusammen In meinem Programm Empfange ich einen Broadcast jedoch liefert mir ReceiveFrom nur 4 chars zurück OnReceive(int nErrorCode) { [INDENT] const READLEN = 4096; TCHAR buff[READLEN + 1]; CString strSockAddr; UINT uSocketPort; int nRead = ReceiveFrom(buff, READLEN, strSockaddr, uSocketPort [/INDENT] } Warum gibt er mir nur 4 zeichen zurück?? ich habe ja READLEN auf 4096 definiert also sollte er mir auch soviele zeichen zurückgeben und per WireShark hab ich gesehen das die ganze Nachricht ankommt Freundliche grüsse Neo336
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 Hat niemand eine Idee woran das liegen könnte?
Klotzkopp Geschrieben 9. Juni 2010 Geschrieben 9. Juni 2010 Hat niemand eine Idee woran das liegen könnte?Bitte kein Threadpushing, siehe Boardregeln. Wenn du meinst, dass dein Thread zusätzliche Aufmerksamkeit benötigt, wende dich an einen zuständigen Moderator. Zum Problem: nRead ist nach dem Aufruf also 4? Oder woraus folgerst du, dass du nur 4 Zeichen empfängst?
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 entschuldige wollte nicht pushen ja nRead ist 4 nach dem aufruf und im buff sind auch nur die ersten 4 zeichen vorhanden
Klotzkopp Geschrieben 9. Juni 2010 Geschrieben 9. Juni 2010 Sind es denn die richtigen 4 Zeichen? Stimmen Adresse und Port? Oder empfängst du da vielleicht etwas ganz anderes?
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 sie stimmen wenn ich zb "Hallo Welt" sende empfange ich nur "Hall"
Klotzkopp Geschrieben 9. Juni 2010 Geschrieben 9. Juni 2010 Das mit dem Broadcast hatte ich übersehen. Hast du vorher für den Socket SO_BROADCAST gesetzt? Das geht mit SetSockOpt.
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 ja habe ich bool CAsyncSocket::InitBroadcastSocket() { int flag = 1; DWORD dw; sin.sin_family = AF_INET; sin.sin_port = htins(30718); this->Create(30718, SOCK_DGRAM); this->SetSockOpt(SO_BROADCAST, &flag, sizeof(flag)); dw = GetLastError(); if(dw != 0) return false; return true }
Klotzkopp Geschrieben 9. Juni 2010 Geschrieben 9. Juni 2010 Prüf bitte die Rückgabewerte von Create und SetSockOpt. GetLastError solltest du nur dann aufrufen, wenn wirklich etwas schiefgelaufen ist.
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 oke habe ich schnell geändert bool CAsyncSocket::InitBroadcastSocket() { int flag = 1; DWORD dw; sin.sin_family = AF_INET; sin.sin_port = htins(30718); bool b1 = this->Create(30718, SOCK_DGRAM); bool b2 = this->SetSockOpt(SO_BROADCAST, &flag, sizeof(flag)); if(!b1 | !b2 ) { dw = GetLastError(); if(dw != 0) return false; } return true } die Rückgabewerte b1 & b2 sind beide true
Klotzkopp Geschrieben 9. Juni 2010 Geschrieben 9. Juni 2010 Heißt deine Klasse wirklich CAsyncSocket?
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 nein eig nicht // Klassendefinition class CSyndicateSocket : public CAsyncSocket
Klotzkopp Geschrieben 9. Juni 2010 Geschrieben 9. Juni 2010 Jetzt fällt mir auf die Schnelle auch nichts mehr ein. Du kannst dir ja mal das Microsoft-Sample zu diesem Thema ansehen: MSocUdp.exe Implement UDP Using CAsyncSocket
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 ich habe mich da schon mal umgesehen bin jetzt aber nochmal durchgegangen und da ist mir etwas ins auge gestochen kann gerade aber nicht sagen wie weit das mit meinem problem einen zusammenhabg hat #include "stdafx.h" #include "AsyncServer.h" #include "ConnectS.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CConnectSoc CConnectSoc::CConnectSoc() { m_nBytesSent = m_nSendDataLen = 0; m_nRecvDataLen = sizeof(int); // initialize for 4 byte data length <-!!!!!! m_nBytesRecv = 0; m_bReadDataLength = TRUE; }
Guybrush Threepwood Geschrieben 9. Juni 2010 Geschrieben 9. Juni 2010 Was passiert denn wenn du direkt nach dem recieve nochmal recieve aufrufst?
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 nRead = -1 und im buff sind immer noch die ersten 4 char's
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 m_nRecvDataLen = sizeof(int); // initialize for 4 byte data length <-!!!!!! das m_nRecvDataLen wird beim Windows beispiel nachher beim Receive gebraucht wie mein READLEN also könnt ihr den quote vergessen. das ist wohl nur zufall das die den gleich auf 4 gesetzt haben. Ich habe das ganze auch noch mit Receive anstat ReceiveFrom versucht da werden auch nur 4 zurückgegeben benutze ich den selben code jedoch um eine TCP IP nachricht zu empfangen läuft es perfekt, es wird die ganze nachricht empfagen egal ob mit Receive oder ReceiveFrom.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden