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 Zitieren
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 Hat niemand eine Idee woran das liegen könnte? Zitieren
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? Zitieren
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 Zitieren
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? Zitieren
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 sie stimmen wenn ich zb "Hallo Welt" sende empfange ich nur "Hall" Zitieren
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. Zitieren
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 } Zitieren
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. Zitieren
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 Zitieren
Klotzkopp Geschrieben 9. Juni 2010 Geschrieben 9. Juni 2010 Heißt deine Klasse wirklich CAsyncSocket? Zitieren
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 nein eig nicht // Klassendefinition class CSyndicateSocket : public CAsyncSocket Zitieren
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 Zitieren
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; } Zitieren
Guybrush Threepwood Geschrieben 9. Juni 2010 Geschrieben 9. Juni 2010 Was passiert denn wenn du direkt nach dem recieve nochmal recieve aufrufst? Zitieren
neo336 Geschrieben 9. Juni 2010 Autor Geschrieben 9. Juni 2010 nRead = -1 und im buff sind immer noch die ersten 4 char's Zitieren
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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.