0

したがって、サーバー側からクライアントに整数 a =3 を渡そうとしています。問題は、クライアント側でメッセージの printf を実行すると、表示される値が 3 ではなく乱数 (19923 のようなもの) になることです。 .サーバー側で a を値(&a)で渡そうとしましたが、表示された値がハートの形でした。その通信の問題点を確認してください。よろしくお願いします。

   //Server
    #include <windows.h>
    #define BUF_SIZE 256
    LPSTR szMapName = "MyFileMappingObject";

    int main(void)
    {
        int a = 3;
        HANDLE hMapFile;
        LPVOID lpMapAddress;
        BOOL bRet;

        hMapFile = CreateFileMapping(
            INVALID_HANDLE_VALUE,         /* use swap, not a particular file */
            NULL,                     /* default security */
            PAGE_READWRITE,               /* read/write access */
            0,                        /* maximum object size (high-order DWORD) */
            1024,                     /* maximum object size (low-order DWORD) */
            szMapName);               /* name of mapping object */
        if (hMapFile == INVALID_HANDLE_VALUE){
                 printf("CreateFileMapping error %lu",GetLastError());
            }
        lpMapAddress = MapViewOfFile(
                hMapFile,         /* handle to map object */
                FILE_MAP_ALL_ACCESS,  /* read/write permission */
                0,            /* offset (high-order) */
                0,            /* offset (low-order) */
                0);
        if (lpMapAddress == NULL) 
                 printf("MapViewOfFile error");

        //ZeroMemory(lpMapAddress, strlen(szMsg) + 1);
        CopyMemory(lpMapAddress, a, sizeof(a));

        Sleep(10000);

        bRet = UnmapViewOfFile(lpMapAddress);
        if (bRet == FALSE)
                printf("UnampViewOfFile error");

        bRet = CloseHandle(hMapFile);
        if (bRet == FALSE)
                printf("CloseHandle error");

        return 0;
    }
//Client
#include <windows.h>
#include <stdio.h>
#define BUF_SIZE 256
LPSTR szMapName = "MyFileMappingObject";

int main(void)
{
    HANDLE hMapFile;
    LPVOID lpMapAddress;
    BOOL bRet;
    hMapFile = OpenFileMapping(
        FILE_MAP_ALL_ACCESS,                 /* read/write access */
        FALSE,                               /* do not inherit the name */
        szMapName);                          /* name of mapping object */ 

    if (hMapFile == INVALID_HANDLE_VALUE){
        printf("CreateFileMapping error %lu",GetLastError());
        return 1;
    }

    lpMapAddress = MapViewOfFile(
        hMapFile,       /* handle to map object */
        FILE_MAP_ALL_ACCESS,    /* read/write permission */
        0,          /* offset (high-order) */
        0,          /* offset (low-order) */
        0);

    if (lpMapAddress == NULL){
        printf("MapViewOfFile error %d",GetLastError());
        return 1;
    }

    printf("Message from server is: %d\n", lpMapAddress);

    bRet = UnmapViewOfFile(lpMapAddress);
    if (bRet == FALSE){
        printf("UnampViewOfFile");
        return 1;
    }
    bRet = CloseHandle(hMapFile);
    if (bRet == FALSE){ 
        printf("CloseHandle");
        return 1;
    }

    return 0;
}
4

1 に答える 1

1

これは正しくありません:

printf("Message from server is: %d\n", lpMapAddress);

そのまま(a )lpMapAddress型であるため、これは整数値ではなく、ポイント先のメモリ アドレスを出力します。(ポインタ値を出力するために使用する必要があることに注意してください)。LPVOIDvoid*lpMapAddress%p

intを共有メモリに書き込むために使用される手法に基づくと、次のようになります。

CopyMemory(lpMapAddress, a, sizeof(a));

を抽出するintには、逆になります。

int read_a;
CopyMemory(&read_a, lpMapAddress, sizeof(read_a));
printf("Message from server is: %d\n", read_a);

次の行にフォーマット指定子がないことに注意してください。

printf("CreateFileMapping error",GetLastError());

次のようにする必要があります。

printf("CreateFileMapping error: %lu", GetLastError());
于 2012-11-22T14:12:36.740 に答える