udp sendto problem
-
hallo erstmal,
ich beschäftige mich in letzter zeit der programmierung von sockets. und ich mir folgendes ziel gesetzt: ein aufruf einer beliebigen index.html per GET - und so. und genau das wollte ich mit drei sockets machen: einmal tcp, einmal udp und einmal mit nem raw.
also der weg über tcp war schnell gegangen, aber nun hab ich nen problem mit dem udp.
bei sendto bekomme ich stets den fehlercode 10045 ("Der Vorgang wird von dem Objekttyp nicht unterstützt, auf den Bezug genommen wurde") ... wobei es aber bei tcp voll funktionstüchtig ist ...
PS: es handelt sich um eine fehlermeldung des compilers!!!hier mal der code:
#include <windows.h> #include <winsock.h> #include <stdio.h> #include <iostream> using namespace std; int winsock_starten (void); void fehlermeldung (); int socket_senden (int s, char* destIP, const int port); int main () { int s; char destIP []="127.0.0.1"; const int port = 80; winsock_starten (); socket_senden(s, destIP, port); system("pause"); return 0; } int winsock_starten (void) { long rc; WSADATA wsa; WSAStartup(MAKEWORD(2,0),&wsa); if (rc==SOCKET_ERROR) { cout << "winsock_starten "; fehlermeldung(); } } void fehlermeldung () { cout << "fehlercode: " << WSAGetLastError() << endl; } int socket_senden (int s, char* destIP, const int port) { long rc; SOCKADDR_IN addr; const char data []="GET /index.html HTTP/1.1"; s=socket(AF_INET, SOCK_DGRAM,0); if (s==INVALID_SOCKET) { cout << "socket "; fehlermeldung(); } memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(port); addr.sin_addr.s_addr=inet_addr(destIP); rc=sendto(s,data,0,sizeof(data),(sockaddr*)&addr,sizeof(addr)); if (rc==SOCKET_ERROR) { cout << "sendto "; fehlermeldung(); } else { cout << "scheiße es geht\n"; cout << "gesendeter text: " << endl; cout << endl << data; } return 0; }
-
Aha, dein Compiler kann Winsock Fehlercodes ausgeben? Interessant.
Wahrscheinlich muss der Server auch mit UDP arbeiten.
Bei HTTP ist aber UDP doch vollkommener Schwachsinn.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ich Idiot, es handelt sich natürlich nicht um eine Fehlermeldung des Compilers! Was doch das Weglassen eines einzelnen Buchstabens doch für einen völlig verzerrten Sinn ergeben kann

sicherlich ist eine http - udp Korrelation auch anders zu gestalten, aber ob das nun schwachsinn oder sonstwas ist, steht gar nicht zur Debatte.
Ich will doch nur wissen, ob das was ich erstellte richtig ist oder wo ich nen Fehler eingebaut habe

-
Also ich glaube ich hab den Fehler gefunden,
MSDN schrieb:
SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
von http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/sendto_2.asp im Beispielquelltext.
Du hast vergessen Winsock zusagen, das du einen UPD-Socket willst, du sagst ihm nur, dass du einen verbindungslosen (SOCK_DGRAM) Socket willst.
Des weiteren frage ich mich warum du hier:
int winsock_starten (void) { long rc; //<== HIER WSADATA wsa; WSAStartup(MAKEWORD(2,0),&wsa); if (rc==SOCKET_ERROR) { cout << "winsock_starten "; fehlermeldung(); } }"long rc;" vereinbarst, wenn du es doch garnicht mit einem Wert belegst(Rüchgabewert?)?
Ich hoffe ich konnte helfen.
Wenn etwas falsch sein sollte korrigiert mich bitte.
-
der http server wird aber mit accept auf den verbindungsaufbau warten und du sendest einfach mit udp was dahin. ich glaub das geht nicht.
-
Zudem ist dein HTTP-Query nicht gültig.
"GET /index.html HTTP/1.1" <= Da müsste eigentlich noch ein HOST-Headerfeld rein und müssten da nich auch am Ende noch 2x '\n' hin ?HTTP nutzt soviel ich weiss überhaupt kein UDP, zumindest kenne ich keinen Server der auf UDP-Pakete auf Port 80 antwortet

Ich würde außerdem sagen, dass da was vertauscht ist:
rc=sendto( s, data, // laut msdn: buffer 0, // laut msdn: length of buffer - Bei dir 0!! sizeof(data), // laut msdn: flags - Sollten vermutl. 0 sein ;D (sockaddr*)&addr, sizeof(addr));
-
alles falsch
-
jo danke, geeky, die vertauschung war der fehler!
@zusammenfassung: wie, alles falsch. kannste das mal erläutern?
-
was falsch ist haben die vorposter schon erläutert.
habe das nur nochmal zusammengefasst
:p