سؤال

باستخدام أمثلة العميل والخادم الموجودة هنا: http://www.winsocketdottworkprogramming.com/winsock2programming/winsock2advancedmailslot14.html. تجميعها مع VS2008، تشغيل الخادم، ثم "MySlot العميل" أظل الحصول على "FreeFail فشل مع الخطأ 53." هل لدي احد اى افكار؟ روابط إلى أمثلة مائلات أخرى هي أيضا موضع ترحيب، شكرا.

الخادم:

    // Server sample
#include <windows.h>
#include <stdio.h>

void main(void)
{

    HANDLE Mailslot;
    char buffer[256];
    DWORD NumberOfBytesRead;

    // Create the mailslot

    if ((Mailslot = CreateMailslot("\\\\.\\Mailslot\\Myslot", 0, MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE)
    {
        printf("Failed to create a mailslot %d\n", GetLastError());
        return;
    } 

    // Read data from the mailslot forever!

    while(ReadFile(Mailslot, buffer, 256, &NumberOfBytesRead, NULL) != 0)
    {
        printf("%.*s\n", NumberOfBytesRead, buffer);
    }
}

عميل:

// Client sample

#include <windows.h>
#include <stdio.h>

void main(int argc, char *argv[])
{
    HANDLE Mailslot;
    DWORD BytesWritten;
    CHAR ServerName[256];

    // Accept a command line argument for the server to send a message to

    if (argc < 2)
    {
        printf("Usage: client <server name>\n");
        return;
    }

    sprintf(ServerName, "\\\\%s\\Mailslot\\Myslot", argv[1]);

    if ((Mailslot = CreateFile(ServerName, GENERIC_WRITE,

        FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
    {
        printf("CreateFile failed with error %d\n", GetLastError());
        return;
    }

    if (WriteFile(Mailslot, "This is a test", 14, &BytesWritten, NULL) == 0)
    {
        printf("WriteFile failed with error %d\n", GetLastError());
        return;
    }

    printf("Wrote %d bytes\n", BytesWritten);
    CloseHandle(Mailslot);
}
هل كانت مفيدة؟

المحلول

خطأ 53 هو error_bad_netpath، "لم يتم العثور على مسار الشبكة". من الواضح أنك تستخدم اسم الخادم الخطأ لل mailslot. يستخدم \\.\mailslot\blah إذا كان الخادم يعمل على نفس الجهاز كعميل الخاص بك. ولا تنسى الهروب من الخلفية في سلسلة: "\\\\.\\mailslot\\blah".

نصائح أخرى

قمت بنسخ الرمز بالضبط كما هو منشور إلى ملفين، جمعها مع VS2008 وخرضر تماما. إذا تم تجميع برنامج العميل الخاص بك كعملة.exe، فاكتب الأمر التالي:

client .

أو

client <computername>

حيث اسم الكمبيوتر هو اسم الكمبيوتر بدون المجال. يمكنك استدعاء API getcomputername. لاسترداد الاسم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top