Pergunta : Programação do soquete - problema com tamanho das limas recebidas no usuário de escuta

Olá!, o

We está no processo para desenvolver uma aplicação para receber & armazenar arquivos de dados de nossos clientes que usam o soquete que programa (os clientes empurrarão as limas no IP & no porto fornecidos no.). Nós terminamos a escrita do código do lado de USUÁRIO para receber as limas e este código estará funcionando continuamente na modalidade de escuta. o

junto com a aplicação de usuário, nós igualmente construímos uma aplicação de CLIENTE experimental para empurrar as limas no usuário para o teste… durante a eliminação de erros da aplicação, nós observamos que emite os índices da lima completa no problema que do

The do único comando nós somos revestimento somos que nosso código do lado de USUÁRIO não pode receber os índices completos das limas emitidas pelo cliente. .sometimes é bem sucedido em receber & em armazenar índices da lima inteira mas às vezes não faz assim & recebe de algum modo somente o

Pleas dos dados… nos deixou saber sobre o problema no seguinte código -

' ---- Começar o código de CLIENTE empurrar limas para o usuário de escuta ----o clientsock do
Private do
Imports System
Imports System.Collections.Generic
Imports System.Net
Imports System.Net.Dns
Imports System.Net.Sockets
Imports System.IO
Imports System.Text
como o strfileName de Socket
Private como o fileNameByte de String
Private como o fileData do
Private do byte () como o
Private do byte () fileNameLen como o
Private SizeofFile do byte () como o ipEnd de Integer
Private como arripAddress de IPEndPoint
Private como o portno do
Private do IP address () enquanto o btnSend_Click secundário de Integer


Protected (remetente de ByVal como o objeto, ByVal e como System.EventArgs) segura o clientData não ofuscante de btnSend.Click
Try
como o clientsock do
do byte () = strfileName novo do
do soquete (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP) = fileNameByte de selctfile.FileName

= Encoding.ASCII.GetBytes (o fileData do
do strfileName) = selctfile.FileBytes
fileNameLen = clientData do
de BitConverter.GetBytes (fileNameByte.Length) = o byte novo (4 + fileNameByte.Length + (fileData.Length - 1)) {}
ata, 0)
(clientData, 4)
(clientData, 4 + fileNameByte.Length) tamanho de/>
/> “do file
SizeofFile = do ipEnd do

de clientData.Length () = clientsock novo do
de IPEndPoint (0) dos arripAddress (, portno). Conetar o

(do ipEnd) não ofuscante para fora como o inteiro = o 0
para fora = clientsock. Emitir (clientData, clientData.Length, 0) o clientsock do

Finally
. Fechar () a extremidade Try
End Sub
do
” ---- Terminar o código de CLIENTE para empurrar limas para o usuário de escuta ----




' ---- Começar o código de USUÁRIO receber limas no usuário de escuta ----o hostname confidencial do
Imports System
Imports System.Collections.Generic
Imports System.Net
Imports System.Net.Dns
Imports System.Net.Sockets
Imports System.IO
Imports System.Text

como arripAddress confidenciais de String
como o strPortNo confidencial do
do IP address () como o portno confidencial de String
como o ipEnd confidencial de Integer
como o serverSock confidencial de IPEndPoint
como o receivedPath confidencial de Socket
como o clientSock confidencial de String
como o clientIpEnd confidencial de Socket
como strClientIpAddress confidenciais de IPEndPoint
como String
que o clientData confidencial como o
do byte () confidencial receivedBytesLen como Integer
confidencial fileNameLen como o nome de arquivo confidencial de Integer
como strSizeofFile confidencial de String
como o bWrite confidencial de String
enquanto extremidade principal secundária Sub
do
do
GoToListen do
de BinaryWriter
() ()  Hostname secundário confidencial do

Try
do
GoToListen () = de
de Dns.GetHostName () arripAddress = de
de Dns.GetHostAddresses (hostname) strPortNo = de
de System.Configuration.ConfigurationManager.AppSettings (“PortNo”) portno = (strPortNo) ipEnd do
= IPEndPoint novo (IPAddress.Parse (arripAddress (0) .ToString ()), o serverSock do

do portno) = receivedPath novo do
do soquete (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP) = de
serverSock.Bind de System.Configuration.ConfigurationManager.AppSettings (“ReceivedFullPath”) clientSock do

do
serverSock.Listen (ipEnd) (100) = clientIpEnd do

de serverSock.Accept () = strClientIpAddress do
de clientSock.RemoteEndPoint () =

de clientIpEnd.Address.ToString () “que recebe os dados do cliente & do nome de arquivo, tipo assim como o tamanho do clientData do file
= o
do byte (800000 - 1) {} receivedBytesLen = 0
receivedBytesLen = o
do
de clientSock.Receive (clientData)” 5 segundos atrasam entre a recepção dos índices & escrevendo no

do file
System.Threading.Thread.Sleep (5000) fileNameLen = (clientData, 0) nome de arquivo do
=

de Encoding.ASCII.GetString (o clientData, 4, fileNameLen) “tamanho do File
strSizeofFile = () escrita & economia de/>
” o bWrite do file
= BinaryWriter novo (File.Open (receivedPath + nome de arquivo, FileMode.Create))sockException do prendedor do
do
do
bWrite.Write (o clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen) como extremidade Sub
' de Try
do fim do
do
GoToListen do
clientSock.Close do
bWrite.Close do
Finally
serverSock.Close de SocketException
MsgBox (“erro na conexão” + sockException.Message) () () () () ---- Terminar o código de USUÁRIO para receber limas no usuário de escuta ----
class= do

Resposta : Programação do soquete - problema com tamanho das limas recebidas no usuário de escuta

o amortecedor da recepção é demasiado grande e o processo está terminando antes que o cliente possa fornecer o bloco seguinte de dados

tentar isto

    Função ReceiveData (skt de ByVal como o soquete) como MemoryStream
        'criar um memorystream para prender os dados entrantes
        Escurecer a Senhora como MemoryStream novo
        Quando verdadeiro
            'refrescar o amortecedor
            Escurecer o buf = o byte novo (1023) {}

            'receber alguns dados
            Escurecer o Br = o skt. Receber (buf, buf. Comprimento, SocketFlags.None)

            'redigir os dados no memorystream
            Senhora. Escrever (buf, 0, Br)

            'se o número de bytes é menor do que a capacidade de amortecedor nós estamos na extremidade do córrego
            Se Br <� buf="">
            'dar ao cliente uma possibilidade emitir mais dados (10 milissegundos)
            Esperar (10)
        Terminar quando
        Retornar a Senhora
    Terminar a função

    Sub a espera (ByVal i como o inteiro)
        Escurecer o st como o cronômetro novo
        st. Começar ()
        Fazem até o St. Elapsed.TotalMilliseconds > i
            Application.DoEvents ()
        Laço
        st. Parar ()
        st = nada
    Submarino da extremidade
Outras soluções  
 
programming4us programming4us