⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blaster.c

📁 Blaster is a simple application that illustrates Windows NT 5.0’s support of the IrDA protocol. IrDA
💻 C
字号:
//#define UNICODE
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <shellapi.h>
#include <winsock.h>
#include <af_irda.h>
#include <resource.h>
#include <resrc1.h>

#define DEVICE_LIST_LEN     5
#define WSBUF_SIZE          128

#define RXBUF_SIZE          2045*8 // max pdu * max window + 1
#define DEF_SENDBUF_SIZE    2045*7 // max pdu * max window
#define DEF_SENDCNT         100

int             TotalRecvBytes;
HWND            vhWnd;
PDEVICELIST     pDevList;
BYTE            DevListBuff[sizeof(DEVICELIST) - sizeof(IRDA_DEVICE_INFO) +
                            (sizeof(IRDA_DEVICE_INFO) * DEVICE_LIST_LEN)];

TCHAR *
GetLastErrorText();

void
StatusMsg(TCHAR *pFormat, ...)
{
    TCHAR   Buf[128];
    
    va_list ArgList;
    
    va_start(ArgList, pFormat);

    wvsprintf(Buf, pFormat, ArgList);

    SendMessage(GetDlgItem(vhWnd, IDC_STATUS), EM_REPLACESEL, 0,
                        (LPARAM) Buf);

    va_end(ArgList);
}



void
RecvThread(PVOID Arg)
{
    SOCKADDR_IRDA   ServSockAddr  = { AF_IRDA, 0, 0, 0, 0, "Blaster" };
    SOCKADDR_IRDA   PeerSockAddr;
    SOCKET          NewSock, Sock;
    int             sizeofSockAddr = sizeof(SOCKADDR_IRDA);
    int             RecvSize;
    TCHAR           wsBuf[WSBUF_SIZE];
    char            *RecvBuf;
    int             BytesRecvd;

    
    StatusMsg(TEXT("socket(AF_IRDA)\r\n"));

    if ((Sock = socket(AF_IRDA, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        StatusMsg(TEXT("   error: %s\r\n"), GetLastErrorText());
        return;
    }    
    else
        StatusMsg(TEXT("   socket created (%d).\r\n"), Sock);
    
    StatusMsg(TEXT("bind(%s)\r\n"), ServSockAddr.irdaServiceName);
    if (bind(Sock, (const struct sockaddr *) &ServSockAddr, 
             sizeof(SOCKADDR_IRDA)) == SOCKET_ERROR)
    {
        StatusMsg(TEXT("   error: %s\r\n"), GetLastErrorText());
        return;
    }
    StatusMsg(TEXT("   bind() succeeded\r\n"));
    
    StatusMsg(TEXT("listen()\r\n"));
    if (listen(Sock, 5) == SOCKET_ERROR)
    {
        StatusMsg(TEXT("   error: %s\r\n"), GetLastErrorText());
        return;
    }
    StatusMsg(TEXT("   listen() succeeded\r\n"));

    
    RecvBuf = LocalAlloc(0, RXBUF_SIZE);

    while(1)    
    {    
        StatusMsg(TEXT("accept() - waiting for connection...\r\n"));
    
        if ((NewSock = accept(Sock, (struct sockaddr *) &PeerSockAddr, 
               &sizeofSockAddr)) == INVALID_SOCKET)
        {
            StatusMsg(TEXT("   error: %s\r\n"), GetLastErrorText());
            return;
        }
    
        StatusMsg(TEXT("accept(), new connection\r\n"));

        TotalRecvBytes = 0;
        
        while(1)
        {
            if ((BytesRecvd = recv(NewSock, RecvBuf, RXBUF_SIZE, 0)) == 
                SOCKET_ERROR)
            {
                StatusMsg(TEXT("recv() failed\r\n"));
                return;
            }
            TotalRecvBytes += BytesRecvd;
        
            if (BytesRecvd == 0)
            {
                StatusMsg(TEXT("recv() = 0, connection closed\r\n"));
                break;
            }
        }           
        closesocket(NewSock);        
    }

    return;
}

void
SendThread(PVOID Arg)
{
    int             DevListLen = sizeof(DevListBuff);
    int             SendSize, SendCnt, i, Sent;
    TCHAR           wsBuf[WSBUF_SIZE];
    char            *pSendBuf;   
    SOCKET          Sock;    
    SOCKADDR_IRDA   DstAddrIR  = { AF_IRDA, 0, 0, 0, 0, "Blaster" };
    
    StatusMsg(TEXT("socket(AF_IRDA)\r\n"));

    if ((Sock = socket(AF_IRDA, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        StatusMsg(TEXT("   error: %s\r\n"), GetLastErrorText());
        goto done;
    }    
    else
        StatusMsg(TEXT("   socket created (%d).\r\n"), Sock);
    

    StatusMsg(TEXT("getsockopt(IRLMP_ENUMDEVICES)\r\n"));
    
    if (getsockopt(Sock, SOL_IRLMP, IRLMP_ENUMDEVICES, 
                   (char *) pDevList, &DevListLen) == SOCKET_ERROR)
    {   
        StatusMsg(TEXT("   error: %s.\r\n"), GetLastErrorText());
        goto done;
    }
    StatusMsg(TEXT("%d device(s) found.\r\n"),
              pDevList->numDevice);
    
    if (pDevList->numDevice == 0)
    {
        StatusMsg(TEXT(" NO DEVICES FOUND\r\n"));
        goto done;
    }    

    memcpy(DstAddrIR.irdaDeviceID, 
           pDevList->Device[0].irdaDeviceID, 4);
    
#ifdef UNICODE        
            mbstowcs(wsBuf, pDevList->Device[0].irdaDeviceName, WSBUF_SIZE);
#else
            strcpy(wsBuf, pDevList->Device[0].irdaDeviceName);
#endif        
    
    StatusMsg(TEXT("connect() to %s...\r\n"), wsBuf);
    
    if (connect(Sock, (const struct sockaddr *) &DstAddrIR, 
                sizeof(SOCKADDR_IRDA)) == SOCKET_ERROR)
    {
        StatusMsg(TEXT("   connect() error: %s\r\n"), GetLastErrorText());
        goto done;
    }
    
    
    GetWindowText(GetDlgItem(vhWnd, IDC_SENDSIZE), wsBuf, WSBUF_SIZE);
    
    SendSize = atoi(wsBuf);
    
    GetWindowText(GetDlgItem(vhWnd, IDC_SENDCNT), wsBuf, WSBUF_SIZE);
    
    SendCnt = atoi(wsBuf);
    
    StatusMsg(TEXT("connected, sending %d\r\n"), SendCnt*SendSize);
        
    pSendBuf = LocalAlloc(0, SendSize);
    
    for (i=0; i < SendSize; i++)
    {
        pSendBuf[i] = (char) i;
    }    

    for (i=0; i < SendCnt; i++)
    {
        Sent = send(Sock, pSendBuf, SendSize,0); 
            
        if (Sent == SOCKET_ERROR)
        {
            StatusMsg(TEXT("send() failed %s\r\n"), 
                        GetLastErrorText());
            break;        
        }
    }  
    
    StatusMsg(TEXT("done sending\r\n"));
    
    LocalFree(pSendBuf);
    closesocket(Sock);

done:

    EnableWindow(GetDlgItem(vhWnd, IDC_SEND), 1);
}


void
DisplayThread(PVOID Args)
{
    TCHAR PBuf[32];
    int     Last, Curr;
    int     cnt = 1;
       
    while(1)
    {
        Last = TotalRecvBytes;    
        Sleep(1000);
        Curr = TotalRecvBytes;
            
        wsprintf(PBuf, "%u", TotalRecvBytes);
        SetWindowText(GetDlgItem(vhWnd, IDC_RXCNT), PBuf);        
        
        wsprintf(PBuf, "%u", Curr-Last);
        SetWindowText(GetDlgItem(vhWnd, IDC_BYTESEC), PBuf);        
        
    }    
}

LRESULT CALLBACK
DialogProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
    HANDLE  hThread;
    DWORD   ThreadId;
    
    switch (message)
    {
      case WM_INITDIALOG:
      {
        TCHAR pBuf[32];
          
        SetFocus(GetDlgItem(hDlg, IDC_SENDSIZE));                    
        vhWnd = hDlg;                    
    
        wsprintf(pBuf, "%d", DEF_SENDBUF_SIZE);
        SetWindowText(GetDlgItem(hDlg, IDC_SENDSIZE), pBuf);        

        wsprintf(pBuf, "%d", DEF_SENDCNT);
        SetWindowText(GetDlgItem(hDlg, IDC_SENDCNT), pBuf);        
        
        CloseHandle(CreateThread(NULL, 0,
                (LPTHREAD_START_ROUTINE) RecvThread, NULL, 0, &ThreadId));          
                                      
        CloseHandle(CreateThread(NULL, 0,
                 (LPTHREAD_START_ROUTINE) DisplayThread, NULL, 0, &ThreadId));                                    
        break;
      }  
      case WM_COMMAND:
        switch (LOWORD(wParam))
        {
          case IDC_SEND:
            EnableWindow(GetDlgItem(hDlg, IDC_SEND), 0);
            CloseHandle(CreateThread(NULL, 0,
                                     (LPTHREAD_START_ROUTINE) SendThread,
                                      NULL, 0, &ThreadId));
            break;
                          
          case IDCANCEL:
            DestroyWindow(hDlg);
            break;
        }
        break;
        
      case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
        
    return 0;
}
WinMain(HINSTANCE hInstance, HINSTANCE hInstPrev, LPSTR pCmdLine,
     int nCmdShow)
{
    WSADATA     WSAData;
    WORD        WSAVerReq = MAKEWORD(1,1);
    MSG         msg;
    HWND        hWnd;
    
    if (WSAStartup(WSAVerReq, &WSAData) != 0)
    {
        return 1;
    }

    pDevList = (PDEVICELIST) DevListBuff;
    
    pDevList->numDevice = 0;
    hWnd = CreateDialog(hInstance,
                              MAKEINTRESOURCE( IDD_DIALOG1), NULL,
                              DialogProc);
    if (hWnd)
    {
        ShowWindow(hWnd, SW_SHOWNORMAL);
        UpdateWindow(hWnd);
    }
    else
    {
        return 1;
    }
    
    while( GetMessage( &msg, NULL, 0, 0) != FALSE ) 
	{
        if (hWnd == 0 || !IsDialogMessage(hWnd, &msg))
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }

    
    return 0;
}


TCHAR *
GetLastErrorText()
{
    switch (WSAGetLastError())
    {
      case WSAEINTR:
        return (TEXT("WSAEINTR"));
        break;

      case WSAEBADF:
        return(TEXT("WSAEBADF"));
        break;

      case WSAEACCES:
        return(TEXT("WSAEACCES"));
        break;

      case WSAEFAULT:
        return(TEXT("WSAEFAULT"));
        break;

      case WSAEINVAL:
        return(TEXT("WSAEINVAL"));
        break;
        
      case WSAEMFILE:
        return(TEXT("WSAEMFILE"));
        break;

      case WSAEWOULDBLOCK:
        return(TEXT("WSAEWOULDBLOCK"));
        break;

      case WSAEINPROGRESS:
        return(TEXT("WSAEINPROGRESS"));
        break;

      case WSAEALREADY:
        return(TEXT("WSAEALREADY"));
        break;

      case WSAENOTSOCK:
        return(TEXT("WSAENOTSOCK"));
        break;

      case WSAEDESTADDRREQ:
        return(TEXT("WSAEDESTADDRREQ"));
        break;

      case WSAEMSGSIZE:
        return(TEXT("WSAEMSGSIZE"));
        break;

      case WSAEPROTOTYPE:
        return(TEXT("WSAEPROTOTYPE"));
        break;

      case WSAENOPROTOOPT:
        return(TEXT("WSAENOPROTOOPT"));
        break;

      case WSAEPROTONOSUPPORT:
        return(TEXT("WSAEPROTONOSUPPORT"));
        break;

      case WSAESOCKTNOSUPPORT:
        return(TEXT("WSAESOCKTNOSUPPORT"));
        break;

      case WSAEOPNOTSUPP:
        return(TEXT("WSAEOPNOTSUPP"));
        break;

      case WSAEPFNOSUPPORT:
        return(TEXT("WSAEPFNOSUPPORT"));
        break;

      case WSAEAFNOSUPPORT:
        return(TEXT("WSAEAFNOSUPPORT"));
        break;

      case WSAEADDRINUSE:
        return(TEXT("WSAEADDRINUSE"));
        break;

      case WSAEADDRNOTAVAIL:
        return(TEXT("WSAEADDRNOTAVAIL"));
        break;

      case WSAENETDOWN:
        return(TEXT("WSAENETDOWN"));
        break;

      case WSAENETUNREACH:
        return(TEXT("WSAENETUNREACH"));
        break;

      case WSAENETRESET:
        return(TEXT("WSAENETRESET"));
        break;

      case WSAECONNABORTED:
        return(TEXT("WSAECONNABORTED"));
        break;

      case WSAECONNRESET:
        return(TEXT("WSAECONNRESET"));
        break;

      case WSAENOBUFS:
        return(TEXT("WSAENOBUFS"));
        break;

      case WSAEISCONN:
        return(TEXT("WSAEISCONN"));
        break;

      case WSAENOTCONN:
        return(TEXT("WSAENOTCONN"));
        break;

      case WSAESHUTDOWN:
        return(TEXT("WSAESHUTDOWN"));
        break;

      case WSAETOOMANYREFS:
        return(TEXT("WSAETOOMANYREFS"));
        break;

      case WSAETIMEDOUT:
        return(TEXT("WSAETIMEDOUT"));
        break;

      case WSAECONNREFUSED:
        return(TEXT("WSAECONNREFUSED"));
        break;

      case WSAELOOP:
        return(TEXT("WSAELOOP"));
        break;

      case WSAENAMETOOLONG:
        return(TEXT("WSAENAMETOOLONG"));
        break;

      case WSAEHOSTDOWN:
        return(TEXT("WSAEHOSTDOWN"));
        break;

      case WSAEHOSTUNREACH:
        return(TEXT("WSAEHOSTUNREACH"));
        break;

      case WSAENOTEMPTY:
        return(TEXT("WSAENOTEMPTY"));
        break;

      case WSAEPROCLIM:
        return(TEXT("WSAEPROCLIM"));
        break;

      case WSAEUSERS:
        return(TEXT("WSAEUSERS"));
        break;

      case WSAEDQUOT:
        return(TEXT("WSAEDQUOT"));
        break;

      case WSAESTALE:
        return(TEXT("WSAESTALE"));
        break;

      case WSAEREMOTE:
        return(TEXT("WSAEREMOTE"));
        break;

      case WSAEDISCON:
        return(TEXT("WSAEDISCON"));
        break;

      case WSASYSNOTREADY:
        return(TEXT("WSASYSNOTREADY"));
        break;

      case WSAVERNOTSUPPORTED:
        return(TEXT("WSAVERNOTSUPPORTED"));
        break;

      case WSANOTINITIALISED:
        return(TEXT("WSANOTINITIALISED"));
        break;

        /*
      case WSAHOST:
        return(TEXT("WSAHOST"));
        break;

      case WSATRY:
        return(TEXT("WSATRY"));
        break;

      case WSANO:
        return(TEXT("WSANO"));
        break;
        */

      default:
        return(TEXT("Unknown Error"));
    }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -