Программа UWP не работает так же, как Winforms

Недавно я начал писать программу для отправки файла из одной системы в другую по протоколу TCPClient и .Net.

Программа имеет клиентский метод и серверный метод. Клиент для отправки данных и сервер для получения и создания файла на другом конце.

Когда я изначально писал программу, я делал это с помощью Winforms, и все работало отлично. С тех пор я пытался перенести все на UWP, но с тех пор у меня не было ничего, кроме проблем.

Мне удалось исправить большинство проблем, но у меня возникла проблема, которую я не могу решить. Похоже, что программа не принимает никаких TCP подключений.

Если я отправлю из версии Winforms в версию UWP, произойдет сбой, но в обратном порядке (отправка из версии UWP в версию Winforms) все работает. Это также означает, что я не могу отправить с версии UWP на версию UWP.

Любой совет был бы блестящим, я прикрепил метод для серверной и клиентской сторон.

Спасибо!

private void btnAcceptConn_Tapped(object sender, TappedRoutedEventArgs e)
{
     try
     {

         string hostName = Dns.GetHostName();

         //gets the IP and port number from text boxes
         Int32 server_port = Int32.Parse(txtboxPortNumber.Text);
         IPAddress localAdd = IPAddress.Parse(txtboxServerIP.Text);

         //listen on the specific IP and port no
         TcpListener listener = new TcpListener(localAdd, server_port);


         Byte[] bytes = new Byte[256];

         byte[] fullarrays = new byte[0];

         listen = true;

         while (listen == true)
         {

             //write to log
             string LogMess = "Listening...";
             WriteToLog(LogMess);

             listener.Start();
             //incoming client connected
             TcpClient client = listener.AcceptTcpClient();

             string LogMessConn = "Connected!";
             // WriteToLog(LogMessConn);

             //gets incoming data through network stream
             NetworkStream nwStream = client.GetStream();


             int off = 0;
             Thread.Sleep(200);
             //loop to receive all the data sent by the client
             while (nwStream.DataAvailable)
             {
                 nwStream.Read(bytes, 0, bytes.Length);

                 Array.Resize(ref fullarrays, fullarrays.Length + bytes.Length);

                 Buffer.BlockCopy(bytes, 0, fullarrays, off, bytes.Length);
                 off = +fullarrays.Length;
             }

             CreateFile(fullarrays);

             string LossMessComplete = "Complete Transfer";
             WriteToLog(LossMessComplete);

             client.Close();
             listener.Stop();
             listen = false;
         }
     }
     catch (Exception)
     {
         /*lblError.Visible = true;
         lblErrorMSG.Visible = true;
         lblErrorMSG.Text = "Please check enterted details";*/
     }
}
private void btnSend_Data_Tapped(object sender, TappedRoutedEventArgs e)
{
     Int32 server_port = Int32.Parse(txtboxPortNumber.Text);

     string ServerIP = txtboxServerIP.Text;



     //puts the file into a bytes array. gets the filetosendpath from the file select button 

     Byte[] textToSend = filetobytes(filetosendpath);

     //creates a TCP client object at the IP and port number
     TcpClient client = new TcpClient(ServerIP, server_port);
     client.SendTimeout = 1600000;
     client.ReceiveTimeout = 1600000;
     NetworkStream nwStream = client.GetStream();



     //byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(textToSend);
     //var bytesToSend = textToSend;

     //send the text
     string LogMess = "Sending: " + textToSend;
     WriteToLog(LogMess);
     load_activitylog();
     nwStream.Write(textToSend, 0, textToSend.Length);
}

person obiwanconobi    schedule 24.02.2020    source источник
comment
Отвечает ли это на ваш вопрос? Приложение UWP не может получать, только отправлять, используя сокеты   -  person VuVirt    schedule 24.02.2020
comment
Для прослушивателя используйте IP-адрес: IPAddress localAdd = IPAddress.Any; Когда машина имеет более одного IP-адреса, использование IP-адреса будет получать данные только с одного интерфейса. IP.Any получит с любого интерфейса.   -  person jdweng    schedule 24.02.2020
comment
@VuVirt Я посмотрел на это и не думаю, что это та же проблема. Когда я посмотрел немного глубже, моя программа выдает исключение на стороне клиента с ошибкой: «Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или установленное соединение не удалось, потому что подключенный хост не удалось ответить 192.168.0.146:443'   -  person obiwanconobi    schedule 24.02.2020
comment
@jdweng Я попробовал это, но, к сожалению, это не имело никакого значения! спасибо за совет, но полезно знать на будущее!   -  person obiwanconobi    schedule 24.02.2020
comment
Порт 443 использует безопасный режим TLS/SSL. Так что у вас должен быть htts (не http). Таким образом, вы, вероятно, получаете ответ 401 вместо 200 OK.   -  person jdweng    schedule 24.02.2020
comment
@jdweng я пробовал с разными портами, даже с портом 80, и выдает ту же ошибку!   -  person obiwanconobi    schedule 24.02.2020
comment
Вы должны использовать то, что ожидает сервер. Некоторые серверы будут работать либо с http, либо с https, некоторые будут работать только с одним. Вы работаете с одним и тем же сервером в UWP и Forms? Лучший способ отладки — использовать сниффер, такой как wireshark или fiddler, и сравнить первый запрос в рабочих формах и нерабочий UWP. Затем сделайте заголовки в запросе UWP похожими на заголовки в форме. Будет работать, если сервер тот же. Все ставки сняты, если сервер другой. Проверьте статус ответа, чтобы узнать, получаете ли вы 200 OK или сообщение об ошибке.   -  person jdweng    schedule 24.02.2020
comment
@jdweng Я запутался в этом, потому что в основном тот же код работал, когда он использовал Winforms, теперь UWP что-то останавливает соединение.   -  person obiwanconobi    schedule 24.02.2020
comment
Вероятно, это свойства, которые вы используете для UWP. Какой код вы меняли? Сниффер также покажет сетевой уровень TCP, и вы сможете сравнить сообщение TCP между формами и UWP.   -  person jdweng    schedule 24.02.2020


Ответы (1)


У меня есть это, чтобы работать сейчас. Я почти уверен, что это было связано с «Возможностями» в Appxmanifest.

Я включил «Частные сети» и «Интернет (клиент и сервер)», и это, похоже, заработало!

Спасибо за помощь

person obiwanconobi    schedule 24.02.2020