Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将程序更改为服务?_C++_Windows_Visual Studio_Service_Client Server - Fatal编程技术网

C++ 将程序更改为服务?

C++ 将程序更改为服务?,c++,windows,visual-studio,service,client-server,C++,Windows,Visual Studio,Service,Client Server,我想创建一个可以作为服务运行的应用程序,以及另一个可以与之通信的程序(用c++)。基本上,我希望程序向服务发送消息,服务只是将消息回显给程序 程序的示例输出如下所示: 请输入您的信息:您好 接收来自服务器的响应:hello 我在UDP中有一个非常简单的客户机-服务器程序,可以实现这一点-服务器回显客户机发送的消息所以我的问题是,我可以将服务器更改为服务,并更改客户端,使其仍然与服务通信吗?如果是,这是如何做到的? 我以前从未使用过代码来创建服务,所以如果有人可以链接任何教程,那就太好了 以下是我

我想创建一个可以作为服务运行的应用程序,以及另一个可以与之通信的程序(用c++)。基本上,我希望程序向服务发送消息,服务只是将消息回显给程序

程序的示例输出如下所示: 请输入您的信息:您好 接收来自服务器的响应:hello

我在UDP中有一个非常简单的客户机-服务器程序,可以实现这一点-服务器回显客户机发送的消息所以我的问题是,我可以将服务器更改为服务,并更改客户端,使其仍然与服务通信吗?如果是,这是如何做到的?

我以前从未使用过代码来创建服务,所以如果有人可以链接任何教程,那就太好了

以下是我要更改的程序: 服务器

客户:

void InitWinsock()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
}

int _tmain(int argc, _TCHAR* argv[])
{
    SOCKET socketC;

    InitWinsock();
    struct sockaddr_in serverInfo;
    int len = sizeof(serverInfo);
    serverInfo.sin_family = AF_INET;
    serverInfo.sin_port = htons(1234);
    serverInfo.sin_addr.s_addr = inet_addr("127.0.0.1");

    socketC = socket(AF_INET,SOCK_DGRAM,0);
    while (1)
    {
        char buffer[1024];
        ZeroMemory(buffer, sizeof(buffer));
        printf("Please input your message: ");
        scanf("%s", buffer);
        if (strcmp(buffer,"exit") == 0)
            break;
        if (sendto(socketC, buffer, sizeof(buffer), 0, (sockaddr*)&serverInfo, len) != SOCKET_ERROR)
        {
            if (recvfrom(socketC, buffer, sizeof(buffer), 0, (sockaddr*)&serverInfo, &len) != SOCKET_ERROR)
            {
                printf("Receive response from server: %s\n", buffer);
            }
        }
    }
    closesocket(socketC);

    return 0;
}

忘记更改代码,只需使用

正如塞格马特所说。使用Svp.cpp中的代码,并将其放入服务器中。将
SVCNAME
更新为您的服务名称。将代码放入您的
\u tmain
中,并将其放入
SvcInit
的底部,此处的
任务:执行工作直到服务停止。取出
,同时取出其下方的

另外,您的服务器在主循环中有一个
Sleep(500)
。这是不必要的,因为服务器无论如何都会阻塞
recv

要终止服务,我不使用
ghSvcStopEvent
,只需将套接字句柄和一些
closing
标志设置为全局,然后设置标志并在收到
service\u CONTROL\u STOP
信号时关闭套接字


您将有更多的清理细节,但这应该不仅仅是开始…

感谢您的链接。但是我能把这些代码放到我现有的程序中吗?Srvany可以处理你不能更改的事情。这并不意味着你应该将其用于你可以改变的事情。我更喜欢使用它,而不是将特定于Windows的代码添加到一个完全可移植的应用程序中,但在这种情况下,OP似乎是在Windows上设置的,没错。
void InitWinsock()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
}

int _tmain(int argc, _TCHAR* argv[])
{
    SOCKET socketC;

    InitWinsock();
    struct sockaddr_in serverInfo;
    int len = sizeof(serverInfo);
    serverInfo.sin_family = AF_INET;
    serverInfo.sin_port = htons(1234);
    serverInfo.sin_addr.s_addr = inet_addr("127.0.0.1");

    socketC = socket(AF_INET,SOCK_DGRAM,0);
    while (1)
    {
        char buffer[1024];
        ZeroMemory(buffer, sizeof(buffer));
        printf("Please input your message: ");
        scanf("%s", buffer);
        if (strcmp(buffer,"exit") == 0)
            break;
        if (sendto(socketC, buffer, sizeof(buffer), 0, (sockaddr*)&serverInfo, len) != SOCKET_ERROR)
        {
            if (recvfrom(socketC, buffer, sizeof(buffer), 0, (sockaddr*)&serverInfo, &len) != SOCKET_ERROR)
            {
                printf("Receive response from server: %s\n", buffer);
            }
        }
    }
    closesocket(socketC);

    return 0;
}