Frage : Einfaßungs-Programmierung - Problem mit Größe der Akten empfangen auf hörendem Bediener

Hallo, sind

We im Prozess, zum einer Anwendung zu entwickeln, um Dateien von unseren Klienten zu empfangen u. zu speichern, welche die programmierende Einfaßung verwenden (die Klienten drücken die Akten am gelieferten IP u. am Hafen Nr.). Wir haben das Schreiben des BEDIENER-Seitencodes abgeschlossen, um die Akten zu empfangen und dieser Code wird ununterbrochen in hörenden Modus. laufen.

zusammen mit der Bedieneranwendung, haben wir auch eine Probe-KLIENTEN-Anwendung aufgebaut, um die Akten auf dem Bediener für Prüfung… während des Ausprüfens der Anwendung zu drücken, beobachteten wir, dass sie den Inhalt der kompletten Akte einziger Befehl

The im Problem sendet, das wir Einfassung sind sind, dass unser BEDIENER-Seitencode nicht in der Lage ist, den kompletten Inhalt der Akten zu empfangen, die vom Klienten. .sometimes gesendet werden er erfolgreich ist, wenn er Inhalt der vollständigen Akte empfängt u. speichert, aber manchmal er so tun nicht kann u. irgendwie nur teilweises Daten…

Pleas informierte uns über das Problem im Folgenden Code -

' empfängt ---- KLIENTEN-Code beginnen, um Akten zum hörenden Bediener zu drücken ----
Imports System
Imports System.Collections.Generic
Imports System.Net
Imports System.Net.Dns
Imports System.Net.Sockets
Imports System.IO
Imports System.Text

Private clientsock als Socket
Private strfileName als String
Private fileNameByte als Byte ()
Private fileData als Byte ()
Private fileNameLen als Byte ()
Private SizeofFile als Integer
Private ipEnd als IPEndPoint
Private arripAddress als IP address ()
Private portno, während Integer


Protected VorbtnSend_Click (ByVal Absender als Gegenstand, ByVal e als System.EventArgs) btnSend.Click
Try
schwaches clientData als Byte ()
clientsock = neues Einfaßung (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
strfileName = selctfile.FileName

fileNameByte = Encoding.ASCII.GetBytes behandelt (strfileName)
fileData = selctfile.FileBytes
fileNameLen = BitConverter.GetBytes (fileNameByte.Length)
clientData = neues Byte (4 + fileNameByte.Length + (fileData.Length - 1)) {}
fileNameLen.CopyTo (clientData, 0)
fileNameByte.CopyTo (clientData, 4)
, 4 + fileNameByte.Length)/>
/> „Größe von file
SizeofFile = clientData.Length ()

von ipEnd = neues IPEndPoint (arripAddress (0) , portno)
clientsock. (ipEnd) das

heraus anschließen schwach als ganze Zahl = 0
heraus = clientsock. Senden (clientData, clientData.Length, 0)

Finally
clientsock. ()
Ende Try
End Sub
schließen“ ---- KLIENTEN-Code beenden, um Akten zum hörenden Bediener zu drücken ----




' ---- BEDIENER-Code beginnen, um Akten auf dem hörenden Bediener zu empfangen ----
Imports System
Imports System.Collections.Generic
Imports System.Net
Imports System.Net.Dns
Imports System.Net.Sockets
Imports System.IO
Imports System.Text

privates hostname als String
private arripAddress als IP address ()
privates strPortNo als String
privates portno als Integer
privates ipEnd als IPEndPoint
privates serverSock als Socket
privates receivedPath als String
privates clientSock als Socket
privates clientIpEnd als IPEndPoint
private strClientIpAddress als String
, das privates clientData als Byte ()
, das privat ist, als privates Integer
receivedBytesLen, fileNameLen als Integer
privater Dateiname als String
privates strSizeofFile als String
privates bWrite während BinaryWriter

Vorhaupt ()
GoToListen ()
Ende Sub
 
privates VorGoToListen ()

Try
hostname = Dns.GetHostName ()
arripAddress = Dns.GetHostAddresses (hostname)
strPortNo = System.Configuration.ConfigurationManager.AppSettings („PortNo“)
portno =
ipEnd = neues IPEndPoint (IPAddress.Parse (arripAddress (0) .ToString ()), portno)

serverSock = neues Einfaßung (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
receivedPath = System.Configuration.ConfigurationManager.AppSettings („ReceivedFullPath“)
serverSock.Bind (ipEnd)
serverSock.Listen (100)

clientSock = serverSock.Accept ()

clientIpEnd = clientSock.RemoteEndPoint ()
strClientIpAddress = clientIpEnd.Address.ToString ()

„die Daten vom Klienten u. vom Dateinamen, Art empfangend sowie Größe von file
clientData = neues Byte (800000 - 1) {} receivedBytesLen
= 0
receivedBytesLen = clientSock.Receive (clientData)

“ 5 Sekunden verzögern zwischen dem Empfangen des Inhalts u. schreibend fileNameLen sie in file
System.Threading.Thread.Sleep (5000)

= (clientData, 0)
Dateiname = Encoding.ASCII.GetString (clientData, 4, fileNameLen),

„Größe des strSizeofFile File
= ()/>
“ Schreiben u. Einsparung das file
bWrite = neues BinaryWriter (File.Open (receivedPath + Dateiname, FileMode.Create))
bWrite.Write (clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen),

Fang sockException wie SocketException
MsgBox („Störung im Anschluss“ + sockException.Message)
Finally
serverSock.Close ()
bWrite.Close ()
clientSock.Close ()
GoToListen ()
Ende Try
Ende Sub
' ---- BEDIENER-Code beenden, um Akten auf dem hörenden Bediener zu empfangen ----

Antwort : Einfaßungs-Programmierung - Problem mit Größe der Akten empfangen auf hörendem Bediener

der empfangenpuffer ist zu groß und der Prozess beendet, bevor der Klient den folgenden Block von Daten liefern kann

dieses versuchen

    Funktion ReceiveData (ByVal skt als Einfaßung) als MemoryStream
        'ein memorystream verursachen, um die ankommenden Daten zu halten
        Frau als neues MemoryStream verdunkeln
        Wenn zutreffend
            'den Puffer erneuern
            Buf verdunkeln = neues Byte (1023) {}

            'etwas Daten empfangen
            Br = skt verdunkeln. Empfangen (buf, buf. Länge, SocketFlags.None)

            'die Daten in das memorystream schreiben
            Frau. Schreiben (buf, 0, Br)

            'wenn die Zahl Bytes kleiner als ist, die Dämpfungsfähigkeit sind wir am Ende des Stromes
            Wenn Br <� buf="">
            'dem Klienten eine Wahrscheinlichkeit geben, mehr Daten (10 Millisekunden) zu senden
            Warten (10)
        Beenden während
        Frau zurückbringen
    Funktion beenden

    Sub Wartezeit (ByVal I als ganze Zahl)
        Str. als neue Stoppuhr verdunkeln
        Str. Beginnen ()
        Bis Str. tun Elapsed.TotalMilliseconds > i
            Application.DoEvents ()
        Schleife
        Str. Stoppen ()
        Str. = nichts
    Enden-Unterseeboot
Weitere Lösungen  
 
programming4us programming4us