Netzwerkspielerei

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mabox

Betreff: Netzwerkspielerei

BeitragDo, Feb 07, 2008 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, hab heute mal angefangen mich ein bisschen mit Netzwerksachen zu beschäftigen. Ich hab Rob's Tutorial durchgelesen und ein bisschen ausprobiert. Nun ist da ein kleines Programm mit dem man auf Internetseiten, aber anscheinend auch auf andere Rechner zugreifen kann. Das mit den Internetseiten hab ich einigermaßen hinbekommen.
Dann wollte ich auf meinen Zweitrechner zugreifen, hab die IP adresse eingegeben aber dann kommt "Memory access violation"

Das Programm sieht so aus Code: [AUSKLAPPEN]
server$ = Input("Adresse>") ; Die Adresse eingeben (IP-Adresse oder z.B. robsite.de)
stream = OpenTCPStream(server$, 21) ; Die Verbindung zum Server auf Port 21 herstellen.

; Die Input/Output-Schleife
Repeat
; Alles was der Server einem schickt auslesen und printen.
   l$ = ReadLine$(stream)
   Print l$
   
; Kommandos eingeben lassen und selbige an den Server schicken.
   i$ = Input(">")
   WriteLine stream, i$
   
; Solange wiederholen bis man 'ende' eingibt.
Until i$ = "ende"
End


Wo liegt der Fehler? muss ich auf dem anderen Rechner erst irgendwas starten damit der überhaupt was sendet?
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
  • Zuletzt bearbeitet von mabox am Do, Feb 14, 2008 23:31, insgesamt 2-mal bearbeitet

Hip Teen

BeitragFr, Feb 08, 2008 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Beim Code testen Debugger anmachen, dann siehst du immerhin in welcher Zeile das ganze ist. Als Information oft sehr hilfreich (Debugger gibts nicht umsonst)
2. Ja, auf dem anderen Rechner muss der Port offen sein und ein Programm auf dem Port laufen, sonst kriegst du diesen Fehler, wenn du von "stream" lesen willst.
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger"
 

Bassmaster

BeitragFr, Feb 08, 2008 12:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Und die frage ist es ein UDP oder TCP Port.

Am besten du Codest noch einen Server für dein Programm dann kannst du auf dem einen PC den Server laufen lassen und von dem anderen vom client aus Befehle an diesen Sende.


Ich hab früher mal sowas in C gemacht:

Server:

Code: [AUSKLAPPEN]


#include <winsock2.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=ADDR_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;
    }


    system(buf);
    printf("Client sendet: %s\n",buf );
    sprintf(buf2,"Folgender Befehl wurde ausgefuehrt %s",buf );

    rc=send(connectedSocket,buf2,strlen(buf2),0);
  }

  closesocket(acceptSocket);
  closesocket(connectedSocket);
  WSACleanup();
  system("PAUSE");
  return 0;

}



int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&wsa);
}






Client:

Code: [AUSKLAPPEN]


#include <winsock2.h>
#include <stdio.h>

//Prototypen
int startWinsock(void);

int main()
{
  long rc;
  SOCKET s;
  SOCKADDR_IN addr;
  char buf[256];


  // Winsock starten
  rc=startWinsock();
  if(rc!=0)
  {
    printf("Fehler: startWinsock, fehler code: %d\n",rc);
    return 1;
  }

  else

  {
    printf("Winsock gestartet!\n");
  }

  // Socket erstellen
  s=socket(AF_INET,SOCK_STREAM,0);
  if(s==INVALID_SOCKET)
  {
    printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("Socket erstellt!\n");
  }

  // Verbinden
  memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
  addr.sin_family=AF_INET;
  addr.sin_port=htons(12345); // wir verwenden mal port 12345
  addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener

  rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
  if(rc==SOCKET_ERROR)
  {
    printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
    getchar();
    return 1;
  }
  else
  {
    printf("Verbunden mit 127.0.0.1..\n");
  }


  // Daten austauschen
  while(rc!=SOCKET_ERROR)
  {
    printf("\nZeichenfolge eingeben [max 256]: ");
    gets(buf);                // gets ist das selbe wie cin>>
    send(s,buf,strlen(buf),0);
    rc=recv(s,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("\nServer antwortet: %s\n",buf);
  }
  closesocket(s);
  WSACleanup();
  return 0;
}

int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&wsa);
}



Der Port ist hier 12345 im Lan geht es auch ohne Port freigaben.

Der Client und der Server sind nicht Perfekt aber ich hab das auch nie komplett fertig gemacht das Programm.

Man kann halt z.b. so Sachen wie Paint, Editor, Taschenrechner etc. auf dem Server laufen lassen.

Wie das alles in Blitz Basic geht hab ich mir noch nicht angekuckt.

mabox

BeitragFr, Feb 08, 2008 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für eure Antworten.
Wenn ich den Debugger anmache kommt die Meldung "stream doesn't exist"
Das mit dem Port wusste ich noch nicht. Wie öffnet man den, bzw. was muss das Programm machen das auf dem anderen Rechner läuft?

Ich denke es ist ein TCP Port, da ich das Programm aus einem TCP Tutorial hab. Leider bringt mir der Code von Bassmaster nichts weil ich fast nichts von C verstehe.
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
 

Dreamora

BeitragFr, Feb 08, 2008 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du via Internet gehst muss der Port im Router offen sein. Da kannst du mit deinem Programm nichts machen. Port nicht offen -> keine Verbindung -> Stream does not exist fehler.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

mabox

BeitragFr, Feb 08, 2008 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie macht das dann z.B. ICQ ?
und wie ist das wenn es nur mit einer LAN Verbindung mach?
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

mabox

BeitragSo, Feb 10, 2008 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry wegen Doppelpost, aber ich will das unbedingt noch hinbekommen.
Ich hab jetzt nen kleines Programm geschrieben, welches eine Nachricht an den anderen PC senden sollte, aber irgendwie funktionierts nicht.
Woran liegt das?
Code: [AUSKLAPPEN]
ip$ = Input ("IP eingeben: ")
tcp = OpenTCPStream(ip$, 21)

WriteLine tcp, "hallo Welt"
Print "Ok"

CloseTCPStream(tcp)

WaitKey
End


Muss ich eigentlich auf beiden PC's die IP des anderen eingeben?
und muss ich die NetzwerkIP oder die PC IP eingeben?

Vielen Dank für eure Hilfe!

BladeRunner

Moderator

BeitragSo, Feb 10, 2008 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Programm kann gar nicht funktionieren, denn es reicht nicht wenn einer sendet. Auf dem anderen PC muss auch gelauscht werden. Wenn jeder jedem anderen einfach so Nachrichten senden könnte hätte man das Internet sicher schon lange abgeschaltet weil du alle 3 ms von irgendeinem Trottel mit news die du nicht willst zugebombt würdest.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

mabox

BeitragSo, Feb 10, 2008 11:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Zum lauschen hab ich das Programm in meinem ersten Post, aber es funktioniert eben nicht wenn ich beide programme auf verschiedenen Rechnern starte.
nochmal zur Frage, muss ich auf beiden Rechnern die IP des anderen eingeben? und ist das erste Programm überhaupt richtig zum auf das andere lauschen?
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
 

FWeinb

ehemals "ich"

BeitragSo, Feb 10, 2008 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Will jetzt mal nicht so sein hier ein Kleines Beisp.

Das ist der Server:

Code: [AUSKLAPPEN]

tcp = CreateTCPServer(12834);Würde nicht 21 nehmen weil das der Port für FTP ist

Timer=CreateTimer(60); Timer erstellen sonst ist die CPU außlastung sehr hoch


Repeat ; Schleife erstellen

WaitTimer Timer;warten auf Timer

Signal=AcceptTCPStream(tcp);Wenn jemand sich mit dem Server Verbindet

If Signal Then ;Wenn es jemand macht dann...
Txt$=ReadLine$(Signal);Lese den text
Print Txt;Schreibe diesen
WaitKey ;Warten bis Taste Gedrückt
End ;Ende
EndIf

If KeyHit(1) Then End ; Wenn Esc denn beenden

Forever;Schleifenende


CloseTCPServer(tcp);Schlißen des Servers


Das ist das Programm welches Daten an den Server senden kann.
(das was du geschrieben hast)

Code: [AUSKLAPPEN]

ip$ = Input ("IP eingeben: ")
tcp = OpenTCPStream(ip$, 12834)

WriteLine tcp, "hallo Welt"
Print "Ok"

CloseTCPStream(tcp)

WaitKey
End
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs
 

Dreamora

BeitragSo, Feb 10, 2008 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
mabox hat Folgendes geschrieben:
Wie macht das dann z.B. ICQ ?


Bei ICQ hats nen zentralen Server der die Verbindung entgegen nimmt, deswegen muss da bei den meisten Usern nichts gemacht werden. Denn ausgehend geht immer sofern nicht paranoide Sicherheitssettings drin sind.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

mabox

BeitragSo, Feb 10, 2008 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
@Ich
Vielen Dank jetzt klappts einigermaßen, also in die eine Richtung gehts aber in die andere irgendwie noch nicht, liegt vielleicht daran, dass auf dem einen PC Vista ist und auf dem anderen XP

@Dreamora
Kann man sich so einen Server (einfach) selbst erstellen?
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
 

E. Urbach

ehemals "Basicprogger"

BeitragSo, Feb 10, 2008 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber es ist nicht einfach.
Wenn du einen (alten) PC hast, der ständig mit dem Internet verbunden ist, kannst du das einrichten.
Die einfachste Möglichkeit wäre wahrscheinlich DynDNS, aber das ist letztendlich dir überlassen.
Hast du einen alten PC + DSL Flatrate + (evtl.) Router mit Port Forwarding?

Für dein Problem mit dem Senden einer Nachricht an einen Zweitrechner ist das allerdings irrelevant, denn ein Server lohnt sich nur, wenn du viele Clients hast, die sich die Informationen vom zentralen Server herunterladen müssen.
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik

mabox

BeitragSo, Feb 10, 2008 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein eigentliches Ziel ist es ein kleines Programm zu schreiben welches Dateien von einem Ort zum andern schickt, möglichst schnell und unkompliziert. Ich fände es einach gut wenn nicht jeder benutzer des Programms an seinem Router Ports freigeben muss, deshalb wäre ein Zweitrechner garnicht schlecht. Mit DynDNS kenn ich mich garnicht aus, aber das kann ich ja noch lernen.

Ja, einen Zweitrechner und eine DSL Flat hab ich aber ich weis nicht was Port Forwarding ist.(?)
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
 

E. Urbach

ehemals "Basicprogger"

BeitragSo, Feb 10, 2008 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
aber ich weis nicht was Port Forwarding ist

Port Forwarding sollte eigentlich jeder Router besitzen.
Wenn du keinen Router hast und dein PC eine direkte Internetverbindung hat, musst du dich nicht darum kümmern.

Zitat:
[...] möglichst schnell und unkompliziert.

Dann brauchst du einen zentralen Server. Dort solltest du ein möglichst sicheres Betriebssystem installieren. Ob es nun Linux oder Windows sein soll, bleibt deine Wahl. Ich würde es an deiner Stelle mit C++ für Linux realisieren, aber wenn der Server mit BB umgesetzt wird, muss es ein Windows-Server sein.

Der Ablauf des Clientprogramms sollte so aussehen:
1. Benutzernamen eingeben
2. Globale IP-Adresse bestimmen
3. Mit zentralem Server verbinden und diesem den Benutzernamen und die dazugehörige IP mitteilen
4. Warten, bis jemand eine Datei senden möchte und ggf. Datei empfangen

Das Serverprogramm:
1. Auf "Anmeldungen" warten
2. Alle aktiven Clients in einer Datenbank speichern
3. Clients, die sich seit einiger Zeit nicht mehr melden, aus der Datenbank löschen
4. Auf IP-Anfragen bezüglich des Benutzernames warten und ggf. dem jeweiligen Benutzer eine Nachricht schicken

Du solltest auf jeden Fall darauf achten, dass du den Empfänger darüber informierst, dass ihm jemand eine Datei schicken möchte und fragen, ob er dies zulassen will oder nicht. Wenn die Dateiübertragung akzeptiert wurde, musst du dich mit dem jeweiligen PC verbinden und auf Antworten warten.

Dies ist nur eine von vielen Möglichkeiten, aber ich würde es auf diese Art und Weise implementieren.
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik

mabox

BeitragSo, Feb 10, 2008 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank!
Ich versuch das Beste daraus zu machen.
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group