Winsock

Hallo

ich habe eine Client Server Anwendung.
wenn ich diese lokal auf dem rechner teste, klappt alles wunderbar.
Der Client sendet datan an den server und der sendet die daten zurueck an den clienten.
Er sendet sachen wie Login daten ( Login:open_mouth:K) und dann transferiert er noch eine Datei die ich blockweise a 200 byte(data:xdfserfg) sende. Wenn er diese erhalten hat bekommt er das signal zum starten (Start:open_mouth:K)
wenn ich beim clienten die 127.0.0.1 eingebe klappt alles bestens, aber kaum probiere ich den clienten von einen anderen rechner aus aus, dann klappt das login aber beim transferieren des File treten dann probleme auf und er beendet sich.
Dies bedeutet das er das Login:open_mouth:K empfaengt aber die daten die ich in blocks a 200 Byte sende nicht.
Dort wo der Client gestartet wurde ist eine Firewall installiert.
Die Winsock Elemente kommunizieren auf dem Port 12345.

Weiss jemand wo der fehler liegt? Liegt es an der Firewall ? Soll ich einen anderen Port fürs winsock element nehmen?

Bin mit mein Latein am Ende und waere ueber hilfe sehr dankbar!

MFG Alex

Schon mal dran gedacht die Firewall einfach zu deaktivieren?

mfg
Chris

MFG Alex

Hallo Alex
Unter Windows XP ist es so, das man eine bestimmte Anwendung für die Firewall freigeben kann, es wird explizit danach gefragt.
Darüberhinaus kommt es auf Deine Firewall an, wie es genau geht.
Aber herzlichen Glückwunsch für dein Programm, das es schon funktioniert. Somit ist eigentlich Optimismus angesagt.
Wie stellst Du denn die Blockgröße ein? Mit TCP/IP kan man doch beliebig große Dateien transportieren, ohne irgendwelche Einstellungen machen zu müssen.
Bei den Netzwerkkarten habe ich auch schon mal eine Option zur Einstelllung der Blockgrößen gesehen, da kannst Du auch mal schauen.
Bei den Einstellungen fürs Netzwerk kann man auch viel falsch machen.
MfG
Matthias

Schon mal dran gedacht die Firewall einfach zu deaktivieren?

mfg
Chris

Hallo Chris,

also ich habe das progg via msn versendet zum zielrechner. dort wurde es installiert und ausgefuehrt. von daher weiss ich net obse was an der Firewall vestellt hat.
Aber das komische ist das zum bsp. der transfer von „Login:open_mouth:K“ und „File:START“ sowie „File:End“ gehen, sonst würde der Client net reagieren :frowning:
Wenn ich aber bsp. die konfiguration des Clienten aus der DB des Servers auslese und in ein File schreibe. dieses dann öffnen und binaer mit einer grösse von 200 Bytes einlese und diese an in der art

bsp:

dim sBuffer as string*200

sBuffer = Space$(200)
Get #F, , sBuffer

sende, so kommen sie nicht an. Meinst du das die Firewall das dann dort blockiert?

MFG Alex

Hallo Matthias,
vielen danl erst einmal für deine antwort :smile:

also ein stueck weiter unten habe ich schon einmal eine Antwort gepostet. Was die sache mit dem Senden angeht, das poste ich dir gleich mal :smile:
und naja wenn es so weiter geht bin ich hier echt am verzweifeln. lokal auf dem rechner klappt es nur net über das inet :frowning:

so nun hier der code

Private Function SendeFile(dateiname As String, c As Winsock) As Boolean 'File wir binaer gesendet...
On Error GoTo fehler
Dim F As Integer
Dim sBuffer As String
Dim nFileSize As Long
Dim nFilePos As Long
Dim nBytesToRead As Long
Dim datei As String
Const Blocksize = 200
 SendeFile = False
 datei = dateiname
 F = FreeFile
 Open datei For Binary As #F
 If InStr(datei, "\") \> 0 Then datei = Mid$(datei, InstrRev(datei, "\") + 1)
 nFileSize = LOF(F)
 Senden c, "File:Start:" + ""
 Do While nFilePos nFileSize Then
 nBytesToRead = nFileSize - nFilePos
 End If
 sBuffer = Space$(nBytesToRead)
 Get #F, , sBuffer
 Senden c, "File:smiley:ata:" + sBuffer
 nFilePos = nFilePos + nBytesToRead
 DoEvents
 Loop
 Close #F
 Senden c, "File:Ende:Fileende erreicht."
 SendeFile = True
 Exit Function
fehler:
 Exit Function
End Function

Sub Senden(w As Winsock, Msg As String) 'Daten werden an 1 bestimmten Clienten gesendet!
On Error Resume Next
Dim Nutzer As String
 If w.Tag = "" Then
 Nutzer = "Unbekannt"
 Else
 Nutzer = w.Tag
 End If
 If w.State = 7 Then
 w.SendData Msg + prüfzeichen
 If UCase(Left(Msg, 4)) = "TEXT" Then
 If Right(Msg, Len(prüfzeichen)) = prüfzeichen Then Msg = Left(Msg, Len(Msg) - Len(prüfzeichen))
 Text1.text = Text1.text & vbNewLine & "Gesendet an " + Nutzer + ": " + Msg
 Text1.SelStart = Len(Text1.text)
 End If
 Else
 Exit Sub
 End If
 Do
 DoEvents
 Loop Until Not (datasend)
End Sub

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Alex
Ich würde sagen, das die Einteilung des Datenstromes in 200 Bytes möglicherweise Systemwidrig ist, weil es den Traffic ausbremst, der Datenstrom erhält eine Störung, der Client oder Server streikt darauf hin möglicherweise.
Dafür spricht auch, das man mit TCP/IP beliebig große Dateien in einem Stück übertragen kann.
Außerdem müßte ich selber erst mal prüfen (weil ich es aus dem Kopf nicht weiß), ob die Accept Methode jedes mal neu aufgerufen werden muß, wenn etwas übertragen wird.
Dann kann ich mich irgendwie daran erinnern, das es möglich ist, den Übertragungsfortschritt ohne ewige Do Loops zu erfragen.
Do Loops mit DoEvents sind nicht besonders elegant/funktioniert nicht immer so, wie es soll.
Das VB reagiert allergisch auf solche Feinheiten.
Mehr kann ich aber nicht helfen.
MfG
Matthias

Hallo Matthias,

vielen dank erst einmal für deine Antwort :smile:
Den Datenstrom habe ich schon reduziert. Anfangs wollte ich mehr mit einmal senden, aber aus deinen genannten Gruenden habe ich ihn reduziert auf halt 200 Bytes. Kleiner würde ich ihn nicht machen wollen, aber ein versuch ist es allemal wert :smile:
Was die Sache mit der Accept Methode angeht. Wenn der Client eine Anfrage an den Server sendet, so muss die Akzeptiert werden ( Accept Methode) Sobald dies einmal geschehen ist kannst du je nach belieben daten senden! Also daran liegt es definitiv nicht :frowning:
Lokal auf den rechner klappt ja alles. Also den server starten und beim Clienten die 127.0.0.1 angeben :smile:
Was die Sache mit den Do und Doevents angeht.
Du konntest nicht erkennen was das genau macht. Also wenn die Sub senden aufgerufen wird, werden die daten gesendet.
danach soll der rechner warten bis die daten aus der leitung sind.
Wenn jedoch eine andere aktion aufgerufen wird soll er dies machen. Deswegen das doevents :wink:
Verlassen wird die schleife sobald die daten gesendet wurden. dann wird das flag gesetzt :smile:

So langsam bekomme ich das gefuehl das es daran liegt das sie ne Firewall hat. Ich werde heute mal zu einer bekannten gehen und den clienten dort mal installieren und schauen ob es dann klappt :smile:
Wenn ja dann weiss ich woran es liegt, wenn nicht bekommen ich noch graue haare *grml*

Trotzdem nochmals ein danke an dich für deine Hilfe :smile:

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

MFG Alex

Hallo Alex
Du schreibst, es wurde eine Verbindung hergestellt, aber die Datenübertragung klappt nicht. Hast Du das protocol auch auf TCP/IP eingestellt?
Übertrage doch zunächst einen einzelnen Block von sagen wir mal 1024 kByte. Eine Aufteilung der Datenübertragung auf 200 Bytes erscheint mir nicht sinnvoll. Die Aufteilung des Datenstromes übernimmt das Windows, da brauchst Du dich gar nicht drum zu kümmern.
Machst Du das trotzdem, wie in Deinem Code, befürchte ich eine Art von Interferenz.
MfG
Matthias

Hallo Matthias,

also sie klappt ja. Ich kann daten senden wie ich will es kommen alle an. Wenn ich nun das file sende dann macht es probleme. da gehen immer daten verloren :frowning:
Sende ich die daten im Step by Step modus also F8 dann geht es und die kommunikations passt.
Ich habe nun versucht die daten mittel Line input auszulesen und zu senden, auch dabei macht es probleme :frowning:
So langsam bin ich mit meinem Latein am ende :frowning:
Die verbindung ist auf TCP / IP gesetzt.

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]