0

サービスとして実行できるアプリケーションと、それと通信できる別のプログラム(C ++)を作成したいと思います。基本的に私はプログラムがサービスにメッセージを送信することを望みます、そしてサービスはただそれらをプログラムにエコーバックします

プログラムの出力例は次のようになり ます。メッセージを入力してください:helloサーバーからの応答を受信します:hello

私はこれを行うUDPの非常に単純なクライアントサーバープログラムを持っています-サーバーはクライアントが送信するメッセージをエコーバックします。だから私の質問は、サーバーをサービスに変更し、クライアントを変更してサービスと通信できるようにすることはできますか?もしそうなら、これはどのように行われますか?

私はこれまでコードを使用してサービスを作成したことがないので、誰かが素晴らしいチュートリアルをリンクできる場合

これが私が変更したいプログラムです:サーバー

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

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

    InitWinsock();
    struct sockaddr_in local;
    struct sockaddr_in from;
    int fromlen = sizeof(from);
    local.sin_family = AF_INET;
    local.sin_port = htons(1234);
    local.sin_addr.s_addr = INADDR_ANY;

    socketS = socket(AF_INET,SOCK_DGRAM,0);
    bind(socketS,(sockaddr*)&local,sizeof(local));
    while (1)
    {
        char buffer[1024];
        ZeroMemory(buffer, sizeof(buffer));
        printf("Waiting...\n");
        if (recvfrom(socketS,buffer,sizeof(buffer),0,(sockaddr*)&from,&fromlen)!=SOCKET_ERROR)
        {
            printf("Received message from %s: %s\n",inet_ntoa(from.sin_addr), buffer);
            sendto(socketS, buffer, sizeof(buffer), 0, (sockaddr*)&from, fromlen);
        }
        Sleep(500);
    }
    closesocket(socketS);

    return 0;
}

クライアント:

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;
}
4

2 に答える 2

0

コードの変更を忘れて、srvanyを使用してください。

于 2013-03-27T11:03:40.913 に答える
0

sergmatが言ったようにサービスの例を使用してください。Svp.cppのコードを使用して、サーバーに配置します。SVCNAMEをサービス名に更新します。あなたのコードを取り、それをある場所_tmainの一番下に置きます。その下のループを取り出します。SvcInitTO_DO: Perform work until service stopswhile

余談ですが、サーバーSleep(500)のメインループにはがあります。とにかくサーバーがブロックするので、それは不要recvです。

サービスを終了するには、を使用する代わりにghSvcStopEvent、ソケットハンドルといくつかのclosingフラグをグローバルにし、フラグを設定して、シグナルを受信したらソケットを閉じますSERVICE_CONTROL_STOP

クリーンアップの詳細がいくつかありますが、それだけでは十分ではありません...

于 2013-03-27T11:54:22.300 に答える