TCP/IP --> UDP
-
Hallo ich habe hier einen TCP/IP Listener und möchte diesen nun in einen UDP Listener umwandeln.
Wenn ich im Code "SOCK_STREAM" in "SOCK_DGRAM" (Z.30) änder bekomme ich eine Fehlermeldung, kann mir da jemand weiterhelfen?
#include <windows.h> #include <winsock.h> #include <stdio.h> //Prototypen int startWinsock(void); int main() { long rc; SOCKET acceptSocket; SOCKET connectedSocket; SOCKADDR_IN addr; char buf[256]; char buf2[300]; // Winsock starten rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); return 1; } else { printf("Winsock gestartet!\n"); } // Socket erstellen acceptSocket=socket(AF_INET,SOCK_STREAM,0); if(acceptSocket==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket erstellt!\n"); } // Socket binden memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(12345); addr.sin_addr.s_addr=INADDR_ANY; rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc==SOCKET_ERROR) { printf("Fehler: bind, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket an port 12345 gebunden\n"); } // In den listen Modus rc=listen(acceptSocket,10); if(rc==SOCKET_ERROR) { printf("Fehler: listen, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("acceptSocket ist im listen Modus....\n"); } // Verbindung annehmen connectedSocket=accept(acceptSocket,NULL,NULL); if(connectedSocket==INVALID_SOCKET) { printf("Fehler: accept, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Neue Verbindung wurde akzeptiert!\n"); } // Daten austauschen while(rc!=SOCKET_ERROR) { rc=recv(connectedSocket,buf,256,0); if(rc==0) { printf("Server hat die Verbindung getrennt..\n"); break; } if(rc==SOCKET_ERROR) { printf("Fehler: recv, fehler code: %d\n",WSAGetLastError()); break; } buf[rc]='\0'; printf("Client sendet: %s\n",buf); sprintf(buf2,"Du mich auch %s",buf); rc=send(connectedSocket,buf2,strlen(buf2),0); } closesocket(acceptSocket); closesocket(connectedSocket); WSACleanup(); return 0; }
Gruß,
Freddy
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) 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.
-
Weil UDP ein bisschen anders funktioniert
-
.... schrieb:
Weil UDP ein bisschen anders funktioniert
So weit bin ich auch schon
und wie?
PS: Ich weis schon, dass UDP Verbindungslos ist und also einige Teile des oben stehenden Programmes entfernt werden müssen, ich habe diese Teile nur zum besseren Verständnis des Programmes dringelassen.
-
Biest du dumm? Lies es doch im Internet nach.
-
.... schrieb:
Biest du dumm? Lies es doch im Internet nach.
Ich glaub mal nicht das ich dumm "bien" und wenn ich eine Lösung auf mein Problem im Internet (oder auch im Forum) gefunden hätte, hätte ich wohl kaum die Frage gestellt, oder?
-
f.sp schrieb:
Wenn ich im Code "SOCK_STREAM" in "SOCK_DGRAM" (Z.30) änder bekomme ich eine Fehlermeldung, kann mir da jemand weiterhelfen?
welche fehlermeldung und wo im code taucht die auf?
btw: ich glaub' nicht, dass 'accept' und 'listen' für UDP irgendwas bewirken
-
So also hier gibts nen Tutorial:
http://www.c-worker.ch/tuts.phpDies solltest du dir durchlesen, weil UDP wirklich ganz anders funktioniert als TCP.
Wichtigster Unterschied: TCP ist verbindungsorientiert, das heißt es muss zuerst eine Verbindungs hergestellt werden. UDP braucht "keine" Verbindung.MFG
Ace
-
AceKiller73 schrieb:
So also hier gibts nen Tutorial:
http://www.c-worker.ch/tuts.phpDas Tutorial kenne ich, aber ich bekomme es einfach nicht zum laufen...
ich bekomme immer die Fehlermeldung: "recvfrom, fehler code: 10054" das senden funktioniert aber.
hier das Programm:
#include <windows.h> #include <winsock.h> #include <stdio.h> #include <conio.h> //Prototypen int startWinsock(void); int main() { long rc; SOCKET s; char buf[256]; SOCKADDR_IN addr; SOCKADDR_IN remoteAddr; int remoteAddrLen=sizeof(SOCKADDR_IN); rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); getch(); return 1; } else { printf("Winsock gestartet!\n"); } //UDP Socket erstellen s=socket(AF_INET,SOCK_DGRAM,0); if(s==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); getch(); return 1; } else { printf("UDP Socket erstellt!\n"); } // addr vorbereiten addr.sin_family=AF_INET; addr.sin_port=htons(5999); addr.sin_addr.s_addr=inet_addr("127.0.0.1"); while(true) { printf("Text eingeben: "); gets(buf); rc=sendto (s,buf,strlen(buf),0,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc==SOCKET_ERROR) { printf("Fehler: sendto, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("%d Bytes gesendet!\n", rc); } rc=recvfrom(s,buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen); if(rc==SOCKET_ERROR) { printf("Fehler: recvfrom, fehler code: %d\n",WSAGetLastError()); getch(); return 1; } else { printf("%d Bytes empfangen!\n", rc); buf[rc]='\0'; printf("Empfangene Daten: %s\n",buf); } } } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
Gruß,
Freddy
-
Das ist ja nur der Quellcode deines Clienten oder??
Weil du kannst ja nicht etwas im gleichen Programm senden und empfangen(also jedenfalls nicht so wie dus amchst)
recvfrom wird ja erst später ausgeführt als sendto.
Wenn du was empfangen willst musst du noch einen server coden, oder dieses ganze recvfrom in einen eigene thread reinpacken(weiß aber net ob da so gut ist)
MFG
Ace
-
Das ist das Beispiel von dem Tutorial (http://www.c-worker.ch/tuts.php)
Ich brauche nur den Client aber wenn ich den "sendto" befehl herausnehme funktioniert es garnichtmehr. Und jetzt funktioniert das empfangen (das was ich eigentlich brauche) nicht...