WriteFile, ERROR_INVALID_PARAMETER

0

Я пытаюсь подключиться к Wi-Fi, чтобы отправить данные получателю для экспериментов. Мне удалось подключить карту к ресиверу, используя Windows API Native для Wi-Fi.

Я сохраняю GUID моей карты в указателе pIfInfo (PWLAN_INTERFACE_INFO) и извлекаю ее для создания дескриптора (WifiAcess), который должен позволить мне писать в соединении.

Тогда, если я запустил это, я получаю ошибку ERROR_INVALID_PARAMETER в функции WriteFile с и без (void *) кастинга перед envois.

Ну, моя проблема в том, что я не знаю, какой параметр недействителен

DWORD bytesSend;
char *buffer ;
unsigned int nbChar ;

данные для отправки

int headerData[4] = {85,0,11,0};
int ServosData[6] = {100,100,0,100,0,0};

 BYTE * envois = new BYTE[11];

 envois[0] = headerData[0] ;
 envois[1] = headerData[1] ;
 envois[2] = headerData[2] ;
 envois[3] = headerData[3] ;
 envois[4] = ServosData[0] ;
 envois[5] = ServosData[1] ;
 envois[6] = ServosData[2] ;
 envois[7] = ServosData[3] ;
 envois[8] = ServosData[4] ;
 envois[9] = ServosData[5] ;

проверить суммирование

 for(int i = 0 ; i<10;i++)
 {
     envois[10] = envois[10] + envois[i] ;
 }
 envois[10] = envois[10]%256 ;
 nbChar = 11 ;

 HANDLE WifiAcess = INVALID_HANDLE_VALUE;
 LPCSTR AcessGUID ;
 char GuidString2Char[46] ;
 char DefChar = ' ';
 bool sendtOk = false ;

здесь мы получаем GUID нашей карты Wlan из Wi-Fi-соединения

    sprintf(GuidString2Char, "\\\\.\\{%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}",
                        pIfInfo->InterfaceGuid.Data1,
                        pIfInfo->InterfaceGuid.Data2,
                        pIfInfo->InterfaceGuid.Data3,
                        pIfInfo->InterfaceGuid.Data4[0],
                        pIfInfo->InterfaceGuid.Data4[1],
                        pIfInfo->InterfaceGuid.Data4[2],
                        pIfInfo->InterfaceGuid.Data4[3],
                        pIfInfo->InterfaceGuid.Data4[4],
                        pIfInfo->InterfaceGuid.Data4[5],
                        pIfInfo->InterfaceGuid.Data4[6],
                        pIfInfo->InterfaceGuid.Data4[7]);

Поместите переведенный GUID в LPCSTR

    AcessGUID = GuidString2Char ;

затем создайте ручку

    WifiAcess = CreateFile(
                                AcessGUID ,  
                                GENERIC_READ | GENERIC_WRITE,
                                FILE_SHARE_READ ,
                                NULL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
                                (HANDLE)INVALID_HANDLE_VALUE); // NULL

Проверить наличие ошибок

        if(WifiAcess == INVALID_HANDLE_VALUE)
        {
            dwResult = GetLastError();
            switch(dwResult)
            {
                case ERROR_FILE_NOT_FOUND  :
                        wprintf(L"\t\t\CreateFile ERROR_FILE_NOT_FOUND\n");
                    break ;
                default :
                        wprintf(L"\t\t\CreateFile default\n");
                    break;
            }
        }
        else {  wprintf(L"\t\t\CreateFile Success\n"); }

Попробуйте написать буфер в WifiAcess Handle

        sendtOk = WriteFile(WifiAcess, envois, nbChar, &bytesSend, NULL) ; 
        if(!sendtOk)
        {
            wprintf(L"\n\t\t\tEcheque de l envois : %d bytes envoyes\n\n", bytesSend);
            dwResult = GetLastError();
            switch(dwResult)
            {

////////////////////////////////////////////////////////////////////////////////////////////////////

                case ERROR_INVALID_PARAMETER  :
                        wprintf(L"\t\t\WriteFile ERROR_INVALID_PARAMETER\n");
                    break ;

////////////////////////////////////////////////////////////////////////////////////////////////////

                case S_FALSE  :
                        wprintf(L"\t\t\WriteFile S_FALSE\n");
                    break ;
                case E_UNEXPECTED  :
                        wprintf(L"\t\t\WriteFile E_UNEXPECTED\n");
                    break ;
                default :
                        wprintf(L"\t\t\WriteFile default with dword : 0x%x \n", dwResult);
                    break;
            }

        }else
        {
            wprintf(L"Data Sendt\n\n");
        }
  • 0
    Просто предположение: многие драйверы устройств не разрешают FILE_SHARE_READ
  • 0
    Создан дескриптор Valid ... Но для проверки Я изменил этот параметр на NULL, он выдает ту же ошибку. Может быть, есть какая-то вещь, похожая на serial com с GetCommState, которая необходима для установки параметра?
Теги:
file-io
wifi

2 ответа

0
Лучший ответ

Хорошо, я понял, что не так, аналог с серийным ком не может быть использован, вместо этого я использовал класс winsock:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms738545(v=vs.85).aspx

================================================== ================================================== = инициализация:

WSADATA wsaData;

    int iResult;
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

// ======================================================================================================
// Création du Socket : 
    struct addrinfo *result = NULL,
                *ptr = NULL,
                hints;

    ZeroMemory( &hints, sizeof(hints) );
    hints.ai_family = AF_INET ;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    #define DEFAULT_PORT "27015"

    // Resolve the server address and port
    iResult = getaddrinfo("10.10.100.254","8899" , &hints, &result); //"10.10.100.254" DEFAULT_PORT  "8899"
    if (iResult == 0) {
        printf("\n\t\tgetaddrinfo, adresse trouvee\n");

        struct addrinfo *res = NULL;
        int error;
        for (res = result; res != NULL; res = res->ai_next)
        {
            char hostname[NI_MAXHOST] = "";

            error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, NI_MAXHOST, NULL, 0, 0);
            if (error != 0)
            {
                fprintf(stderr, "error in getnameinfo: %s\n", gai_strerror(error));
                continue;
            }
            if (*hostname != '\0')
            {
                printf("hostname: %s\n", hostname);
                ptr=res;
            }
        }
    }else
    {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }

    SOCKET ConnectSocket = INVALID_SOCKET;

    // Attempt to connect to the first address returned by
    // the call to getaddrinfo


    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);

    if (ConnectSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }

// ======================================================================================================
// Connect to a socket :
    iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        switch(WSAGetLastError())
        {
        case WSAEHOSTUNREACH:
            wprintf(L"\n\t\tNo route to host. A socket operation was attempted to an unreachable host. See WSAENETUNREACH.\n");
            break;
        default:
            break;
        }
        closesocket(ConnectSocket);
        ConnectSocket = INVALID_SOCKET;

    }

    // Should really try the next address returned by getaddrinfo
    // if the connect call failed
    // But for this simple example we just free the resources
    // returned by getaddrinfo and print an error message

    freeaddrinfo(result);

    if (ConnectSocket == INVALID_SOCKET) {
        printf("Unable to connect to server!\n");
        WSACleanup();
        return 1;
    }

// ======================================================================================================
// Send and recive data : 
    #define DEFAULT_BUFLEN 512

    int recvbuflen = DEFAULT_BUFLEN;

    char *sendbuf = "this is a test";
    //char recvbuf[DEFAULT_BUFLEN];

    // Send an initial buffer

    for(int i = 0; i<100;i++)
    {
        if(sendCommand(ConnectSocket,i, i, 0, i)==-1) break;
        Sleep(10);
    }

// Disconnecting the Client : http://msdn.microsoft.com/en-us/library/windows/desktop/bb530743(v=vs.85).aspx
// shutdown the send half of the connection since no more data will be sent
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        printf("shutdown failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    // cleanup
    closesocket(ConnectSocket);
    WSACleanup();

это сработало для меня

0

Переключение на Windows-сокеты выглядит неплохо. Единственные предложения, которые у меня были бы, - если вам нужна совместимость с перекрестными версиями, добавив некоторую резервную логику, если WSAStartup не сможет найти 2.2, который вы запрашиваете.

Другие предложения были бы стилистическими, главным образом для очистки вашего использования WSACleanup путем консолидации кода очистки для всех случаев - например, с использованием сеанса SEH/leave или goto fail.

  • 0
    Хорошо, спасибо за совет, я не думал о кросс-версии, но она может быть полезна в других проектах. Что касается стилистического предложения, вы правы, это было скорее доказательством того, что концепция пришла прямо с веб-сайта Microsoft, теперь все в классе с комментариями и защищенными значениями. Я также добавляю большее управление ошибками, используя RPCSTATUS.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню