Guybrush Threepwood Geschrieben 15. Oktober 2002 Geschrieben 15. Oktober 2002 Hi, ich hab einen Server und einen Client mit Windows Sockets geschreiben. Leider bekomme ich beim Ausführen des Servers von der Funktion accept jedesmal den Fehler Bad Address und beim Client von der Funktion connect den Fehler Connection refused, da das meine ersten Programme mit Windows Sockets sind hab ich keine Ahnung woran das liegt. Die Programme laufen beide auf verschiedenen PCs in einem Netzwerk. Hat irgendwer vielleicht ne Idee? Ich hab das übrigens anhand des Artikels Setting Up Client and Server Sockets in der MSDN Library gemacht, falls den jemand kennt. Gruß Guybrush Zitieren
TAZttDevil Geschrieben 15. Oktober 2002 Geschrieben 15. Oktober 2002 hi.. zur socket Programmierrung kann ich dir wärmstens ein kostenloses Buch empfehlen... Das ist von der Firma Wiesemann & Theis heisst "TCP/IP Ethernet und Web-IO"... kostet wie gesagt nichts, kann man im Internet anfordern und ist echt super verständlich geschrieben.. kann ich nur jedem empfehlen... Die gehen da auch auf Socketprogrammierung ein (mit vollständigen beispielprogrammen etc...) einfach auf http://www.wut.de gehen, im Menü auf aktuell klicken und da findet man das Buch.. ganz runterscrollen, Formular ausfüllen abschicken, fertig... und wer Angst hat, das das nur Werbung sei, den kann ich beruhigen.. keine Werbung keine weiteren Mails... have fun, Taz... Zitieren
Guybrush Threepwood Geschrieben 15. Oktober 2002 Autor Geschrieben 15. Oktober 2002 Danke für den Tip mit dem Buch, ich schau mir die Seite bei Gelegenheit mal an. Gruß Guybrush Zitieren
Klotzkopp Geschrieben 15. Oktober 2002 Geschrieben 15. Oktober 2002 Den MSDN-Artikel habe ich auf Anhieb nicht gefunden. Zeig uns doch mal den relevanten Teil des Servers. Zitieren
vinc Geschrieben 17. Oktober 2002 Geschrieben 17. Oktober 2002 leider konnte ich den artikel auch nicht in der msdn finden. was wird dort verwendet - sdk oder mfc? poste mal ein bisserl code vom server... versuch mal server und client auf einem rechner laufen zu lassen. wenn das klappt liegt es wahrscheinlich am netz und nicht an deinem programm. das buch von "wut" habe ich mir auch zugelegt. dort sind jedoch nur beispiele in vb und pascal (oder delphi ?) enthalten. aber für das theoretische verständnis ist es nicht schlecht (was aber für die c/c++ programmierung auch nicht wirklich weiter hilft ) gruß vinc Zitieren
Guybrush Threepwood Geschrieben 18. Oktober 2002 Autor Geschrieben 18. Oktober 2002 Ok, hier habt ihr den Code: #ifndef _WINSOCKAPI_ #define _WINSOCKAPI_ #endif #include <windows.h> #include <winsock2.h> #include <stdio.h> #include <conio.h> SOCKET SvrSocket,ClientSocket; sockaddr_in SvrAddr,CliAddr; DWORD Version; WSADATA WsaData; int addr_len; char *Text; main() { Version = MAKEWORD(2,2); if (WSAStartup(Version, &WsaData) != 0) { printf("\nWindows-Socket initialisierung fehlgeschlagen!"); return 0; } if (LOBYTE(WsaData.wVersion) != 2 || HIBYTE(WsaData.wVersion != 2)) { printf ("\nFalsche Windows-Socket Version!"); return 0; } SvrSocket = socket(AF_INET,SOCK_STREAM,0); if (SvrSocket == INVALID_SOCKET) { printf ("\nServer-Socket: INVALID_SOCKET -> %i",WSAGetLastError()); return 0; } SvrAddr.sin_family = AF_INET; SvrAddr.sin_addr.s_addr = INADDR_ANY; SvrAddr.sin_port = htons(5001); if (bind(SvrSocket,(LPSOCKADDR)&SvrAddr,sizeof(sockaddr_in)) == SOCKET_ERROR) { printf ("bind: SOCKET_ERROR -> %i",WSAGetLastError()); return 0; } if (listen(SvrSocket,1) == SOCKET_ERROR) { printf ("\nlisten: SOCKET_ERROR -> %i",WSAGetLastError()); return 0; } for ( ; ; ) { if (kbhit()) { if (getch() == 27) break; } ClientSocket = accept(SvrSocket,(LPSOCKADDR)&CliAddr,&addr_len); if (ClientSocket == INVALID_SOCKET) { printf ("\nClient-Socket: INVALID_SOCKET -> %i",WSAGetLastError()); } else { if (recv(ClientSocket,Text,100,MSG_PEEK) == SOCKET_ERROR) { printf ("\nSOCKET_ERROR: %i",WSAGetLastError()); getch(); } else { printf ("\nÜbertragung erfolgreich:\n\n%s",Text); getch(); } } closesocket(ClientSocket); } WSACleanup(); return 0; } [/PHP] Könnte es vielleicht am Port liegen? Ich hab nämlich keine Ahnung was ich da Angeben muß und hab einfach mal den aus dem Beispiel übernommen. Zitieren
Klotzkopp Geschrieben 18. Oktober 2002 Geschrieben 18. Oktober 2002 Der dritte Parameter von accept ist entgegen der Microsoft-Dokumentation kein reiner Out-Parameter. Füge einfach vor dem accept folgende Zeile ein: addr_len = sizeof( sockaddr_in ); Zitieren
Guybrush Threepwood Geschrieben 18. Oktober 2002 Autor Geschrieben 18. Oktober 2002 Ahh, danke klotzkopp, der Server scheint jetzt zu klappen, allerdings bekomme ich beim Client immer noch Connection Refused. Allso dass die Verbindung abgelehnt wurde. Hier ist einfach mal ein außschnitt aus dem Client: srv_info=getservbyname("ftp","tcp"); if (srv_info == 0) { printf ("Server Error -> %i",WSAGetLastError()); return 0; } sadr.sin_family = AF_INET; sadr.sin_addr.s_addr = inet_addr(SERVER); //Server ist die IP-Adresse des Servers sadr.sin_port=srv_info->s_port; while (connect(CliSocket,(LPSOCKADDR)&sadr,sizeof(sadr)) == SOCKET_ERROR) { printf ("\nconnect: SOCKET_ERROR -> %i",WSAGetLastError()); } printf ("Verbunden!"); if (send(CliSocket,"Hallo",5,MSG_DONTROUTE) == SOCKET_ERROR) { printf ("\nsend: SOCKET_ERROR -> %i",WSAGetLastError()); return 0; } printf ("\nSenden erfolgreich!"); getch(); [/PHP] Gruß Guybrush Zitieren
Klotzkopp Geschrieben 18. Oktober 2002 Geschrieben 18. Oktober 2002 Der Server lauscht auf Port 5001, und der Client versucht, auf Port 21 (ftp) eine Verbindung herzustellen. Das kann nicht wirklich funktionieren Zitieren
Guybrush Threepwood Geschrieben 18. Oktober 2002 Autor Geschrieben 18. Oktober 2002 Das mit dem FTP kahm mir eh schon so komisch vor:) steht aber genau so in dem MSDN Artikel. Ich habs jetzt mit der Funktion getservbyport probiert, dass klappt aber auch nicht so richtig. Ich probier erst mal ein bischen selber und meld mich dann wieder. Danke für die Hilfe! Gruß Guybrush Zitieren
Guybrush Threepwood Geschrieben 22. Oktober 2002 Autor Geschrieben 22. Oktober 2002 Hi, ich hab noch ein bischen an meinem Client rumgebastelt, krieg ihn aber einfach nicht zum laufen. Wie gesagt versuche ich es jetzt mit der Funktion getservbyport bekomme hier aber immer die Fehlermeldung "WSANO_DATA" welche in der MSDN folgendermaßen erklärt ist: "Valid name, no data record of requested type.". Leider kann ich damit überhauptnichts anfangen. Außerdem ändert sich im Verhalten meines Clients nichts wenn der Server nicht läuft, also glaube ich das die gar nicht miteinander kommunizieren. Gruß Guybrush Zitieren
Klotzkopp Geschrieben 22. Oktober 2002 Geschrieben 22. Oktober 2002 getservbyport liefert nur dann Daten, wenn es sich um einen "well-known" (bekannten) Port handelt. Wenn Du das mit 5001 versuchst, dann kann dabei nichts herauskommen, weil damit kein bekannter Dienst verknüpft ist. Du kannst den Port aber beim Client genau wie beim Server einfach setzen: sadr.sin_port = htons( 5001 ); Zitieren
Guybrush Threepwood Geschrieben 22. Oktober 2002 Autor Geschrieben 22. Oktober 2002 [Freudenschrei] Es klappt! [/Freudenschrei] Danke Klotzkopp Gruß Guybrush 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.