[UWP] UWP应用程序,必须使用Win10中的TCP / IP与Windows服务进行通信 [英] [UWP]UWP app which has to communicate with a windows service using TCP/IP in Win10

查看:465
本文介绍了[UWP] UWP应用程序,必须使用Win10中的TCP / IP与Windows服务进行通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个UWP应用程序,必须与Windows服务进行通信在Win10中使用TCP / IP。我使用了"localhost"作为主机名。启动时,我的应用程序将连接到该服务。

它在我的笔记本电脑上工作正常,但在许多其他工作中没有用。我在Package.appxmanifest中启用了(客户端和服务器)功能。我见过推荐CheckNetIsolation.exe的博客,
,但这仅用于开发/调试目的。因此,请帮助您了解如何在Windows服务的UWP应用程序中启用TCP / IP通信。

下面给出了用于处理套接字通信的服务和UWP代码。

Service and UWP codes for handling the socket communication are given below.

Windows服务(服务器):

DWORD
WINAPI
ListenToSocket( LPVOID
lpInstance

{

       
试用

        {

               
WSADATA wsaData;

       ;         
SOCKET ListenSocket =
INVALID_SOCKET ;

                
SOCKET ClientSocket =
INVALID_SOCKET ;

               
SOCKADDR_IN serverSockAddr;

       ;         
SOCKADDR_IN clientSockAddr;

               
//初始化Winsock

< span style ="font-family:Consolas; font-size:8pt">               
int iResult = WSAStartup( MAKEWORD (2,
2),& wsaData);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;

        ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
int addrLen =
sizeof SOCKADDR_IN );

    &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
int 状态;

  ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; serverSockAddr.sin_port = htons(7301);

     &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; serverSockAddr.sin_family =
AF_INET ;

     &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; serverSockAddr.sin_addr。 s_addr
= htonl(
INADDR_ANY );

   &NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; ListenSocket = socket( AF_INET
SOCK_STREAM ,0);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
...... ..

            &NBSP;&NBSP;&NBSP;&NBSP; status = bind(ListenSocket,( LPSOCKADDR )& serverSockAddr,
sizeof (serverSockAddr));

               
...... ..

< span style ="font-family:Consolas; font-size:8pt">        &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; status = listen(ListenSocket,
SOMAXCONN );

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
......

        &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
do

                {

        &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; ClientSocket = accept(ListenSocket,( LPSOCKADDR )& clientSockAddr,
& addrLen);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
.........

        &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
while (...);

      ;&NBSP;&NBSP; }

       
catch (...)

      ;&NBSP;&NBSP; {

        }

       
return 1;

}

UWP App:

StreamSocket ^ MainPage :: ConnectToService()

{

        ;
HostName ^ hostName;

      &NBSP;&NBSP;
StreamSocket ^ socket =
nullptr ;

    &NBSP;&NBSP;&NBSP;&NBSP;
试用

        {

         &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;

        ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; hostName =
ref
new
HostName " localhost" );

                socket =
ref
new
StreamSocket ();

  &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; socket-> Control-> KeepAlive =
false ;

   ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;

        ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; create_task(socket-> ConnectAsync(

      ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;主机名,

                        
" ; 7301"

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ; 
SocketProtectionLevel :: PlainSocket ))。then([ this ]( task < void >
previousTask

                        SocketProtectionLevel::PlainSocket)).then([this](task<void> previousTask)

                {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;        
尝试

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;  {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;        
previousTask 。get();

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ; }

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ; 
catch Exception ^
e)

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;  {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;         
...

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;}

              });

       }

       
catch Exception ^
e)

        {

...

       }

       
return socket;

}

推荐答案

你好,

我注意到您正在使用 

I noticed that you  are using 

hostName = ref new HostName("localhost");


但是在这种情况下,如果主机是您的PC和应用程序在同一台PC上运行它将没有任何问题。但如果该应用程序在另一台PC上运行,它将尝试连接到该PC localhost并且失败。您应该将"localhost"更改为运行Windows服务的PC IP地址
,并配置该PC防火墙以处理来自外部的请求。 

but in this case if host is your PC and app running on the same PC it will work without any problem. But if the app is running on an other PC it will try to connect to that PC localhost and get failed. You should change "localhost" to the PC IP address on which Windows Service is running and configure that PC Firewall for handling requests from outside. 


这篇关于[UWP] UWP应用程序,必须使用Win10中的TCP / IP与Windows服务进行通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆