Problem mit recvfrom; Fehler 10014
-
Hallo,
Ich versuche gerade notdürftig ein Programm zu schreiben welches eine Datei öffnet und diese in 40 Byte Blöcken an einen "Server" schickt. Dieser schickt nach erfolgreicher Verarbeitung dieser 40 Byte ein UDP Paket mit dem Inhalt "next" --> jetzt können die nächsten 40 Byte folgen.
Mein Problem hierbei ist nur, dass ich beim empfangen dieser Bestätigung immer einen Fehler bekomme(Errorcode: 10014) welcher besagt dass der Buffer für die empfangen Daten zu klein ist.
Habe mir das Ganze mit Wireshark angesehen, das "next" wird so übertragen wie es soll(4 Byte Datenblock).
Da ich meinen Fehler nicht finde, hoffe ich dass ihr diesen evtl. finden könnt.
Hier der Code(Ja ich weiß dass er scheußlich geschrieben ist, ist aber wie gesagt nur ein schneller Test..):
#include <iostream> #include <string> #include <fstream> #include <WinSock2.h> using namespace std; int main() { string ip; fstream fb; fb.open ("record.mp3",ios::binary | ios::in); char buffer[40]; char re[4]; cout << "started" << endl; sockaddr_in dest; sockaddr_in local; WSAData data; WSAStartup( MAKEWORD( 2, 2 ), &data ); local.sin_family = AF_INET; local.sin_addr.s_addr = inet_addr( "192.168.0.20" ); local.sin_port = 0; // choose any dest.sin_family = AF_INET; dest.sin_addr.s_addr = inet_addr( "192.168.0.100" ); dest.sin_port = htons( 85 ); // create the socket SOCKET s = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); // bind to the local address bind( s, (sockaddr *)&local, sizeof(local) ); // send the pkt while(fb.eof() == false) { for(int i = 0; i < 40; i++) { if(fb.eof() == false) { buffer[i] = fb.get(); //cout << buffer[i]; } else buffer[i] = 'x'; } int ret = sendto(s, buffer, 40, 0, (sockaddr *)&dest, sizeof(dest)); if (ret != 0) { printf("sendto failed with error %d\n", WSAGetLastError()); //return 1; } while(re != "next") { int rec = recvfrom(s, re, 4, 0, (sockaddr *)&dest, (int *)sizeof(dest)); if (rec != 0) { printf("recvfrom failed with error %d\n", WSAGetLastError()); //return 1; } } re[0] = 'a'; } closesocket(s); WSACleanup(); fb.close(); cout << "finished" << endl; return 0; }MfG Testsocket
-
Wie wäre es mit Ports größer 1024 ? Schon mal von Port 0 gehört? und AF_INET bedeutet dass du TCP/IPv4 verwenden willst. Schau dir lieber erstmal ein Tutorial dazu an.
-
AF_INET --> The Internet Protocol version 4 (IPv4) address family.
Und wo genau steht hier geschrieben dass es dann nur TCP ist?
SOCK_DGRAM -->
A socket type that supports datagrams, which are connectionless, unreliable buffers of a fixed (typically small) maximum length. This socket type uses the User Datagram Protocol (UDP) for the Internet address family (AF_INET or AF_INET6).Dort oben sollte eig 85 stehen, habe den Code vor der änderung kopiert.
MfG
-
85 ist ein reservierter Port und 0 gibt es nicht du musst Ports außerhalb der Well-Known Ports verwenden. Hier ein tutorial: http://www.c-worker.ch/tuts/udp.php
-
Port 0 bedeutet, dass man vom Betriebsystem einen zugewiesen bekommt.
-
Und auch am Port 85 liegt es nicht.
Die Daten werden übermittelt, in beide Richtungen, egal welchen Port ich angebe.
Nur werden sie eben nicht angenommen(vom Prog. selbst)MfG
-
Return Value
If no error occurs, recvfrom returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
Dein Test ist falsch.
-
Da hast du recht, ja. Allerdings werden die Daten dennoch leider nicht richtig empfangen.
Danke jedenfalls!
MfG
-
Wie stellst du das fest? Der Test der while-Bedingung ist Müll! Man kann C-Strings nicht so vergleichen und die vom Socket gelesenen Daten sind noch nicht mal 0-terminiert.
-
Ach.. diesen Test meintest du, hab mich in der schnelle wohl vertan, danke..
Der Grund warum das ganze aber wirklich nicht funktionierte war folgender:
[cpp]int rec = recvfrom(s, re, 4, 0, (sockaddr *)&dest, (int *)sizeof(dest));[/cpp]
Ich habe das &vor sizeof vergessen, dadurch gab's keine richtige Länge und dadurch keinen Empfang.
Danke an alle die mir geholfen haben.
MfG
-
Testsocket schrieb:
Ich habe das &vor sizeof vergessen, dadurch gab's keine richtige Länge und dadurch keinen Empfang.
Ich wußte gar nicht, daß man die Adresse eines sizeof()-Ausdrucks bestimmen kann.