Os bytes que meu programa servidor recebe estão incompletos. Por quê? Estou usando soquetes C # .net
Isso nem sempre acontece. Mas isso acontece com mais frequência do que receber os bytes completament
É assim que o meu cliente prog envia bytes para o meu servidor prog:
public void sendBytes()
{
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
TcpClient cli = tcpServer; //tcpServer is a global TcpClient variable I use to connect to the server.
NetworkStream ns = cli.GetStream();
CopyStreamToStream(fs, ns, null);
ns.Flush();
}
public static void CopyStreamToStream(Stream source, Stream destination, Action<Stream, Stream, Exception> completed)
{
byte[] buffer = new byte[0x1000];
int read;
while ((read = source.Read(buffer, 0, buffer.Length)) > 0) // <- client loop
destination.Write(buffer, 0, read);
}
É assim que o meu servidor prog recebe bytes do meu cliente prog:
FileStream ms = new FileStream(tmpFile, FileMode.Create, FileAccess.Write);
do
{
int szToRead = s.Available; //s is a socket
byte[] buffer = new byte[szToRead];
int szRead = s.Receive(buffer, szToRead, SocketFlags.None);
if (szRead > 0)
ms.Write(buffer, 0, szRead);
}
while(s.Available != 0); //i also tried ms.length < size_of_file_to_be_received_in_bytes
@i entrou no programa e observou os valores, e não sei o que causa a falta de bytes recebidos. Não sei se o problema está no programa cliente ou no servido
i não sei se isso é relevante, mas quando tentei entrar no loop do cliente (para observar o valor de fs.length e verificar se ele será recebido no servidor), todas as 4 tentativas de enviar um arquivo do cliente para o servidor foi bem-sucedido. mas quando eu não assisti o loop do cliente e assisti apenas ao aplicativo do servidor (para ver o valor de ms.length), apenas 1 de 4 tentativas de envio de um arquivo para o servidor foi bem-sucedida. nas três tentativas com falha, o comprimento de ms. é menor que os bytes do arquivo de origem (verifiquei na propriedade do arquivo
Est é onde eu baseiei isso em
INFORMAÇÃO ADICIONAL
No código original (do site em que baseiei meu programa), o loop tem uma condição diferente:
FileStream ms = new FileStream(tmpFile, FileMode.Create, FileAccess.Write);
do
{
int szToRead = s.Available; //s is a socket
byte[] buffer = new byte[szToRead];
int szRead = s.Receive(buffer, szToRead, SocketFlags.None);
if (szRead > 0)
ms.Write(buffer, 0, szRead);
}
while(SocketConnected(s)); // <--- i changed this in my program
private static bool SocketConnected(Socket s)
{
return !(s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0));
}
Acho que o SocketConnected testa se o soquete ainda está conectado porque o código original do programa cliente era o seguinte:
CopyStreamToStream(fs, ns, null);
ns.Flush();
ns.Close();
i removeu o ns.Close () do programa porque desejo manter a conexão do aplicativo cliente com o servidor. Então, eu quero poder verificar se acabei de ler todos os bytes provenientes do aplicativo cliente sem fechar a conexão do soquete do lado do client