c/s模式下的U盘检测

来源:互联网 发布:人工智能所用到的语言? 编辑:程序博客网 时间:2024/06/05 02:35

神坑,刚刚一不小心点错了删除,竟然连恢复都不行。简直了!!!

元旦过后本来以为自己可以开开心心的补(抄)起欠了好几个月的作业的,可是作为一个计算机专业的学生事情永远是那么多!同学,帮我选一下电脑嘛!同学,帮我装一下系统嘛!同学,帮我下载几个软件嘛!同学,帮我做一下文档嘛!同学,我游戏被虐了,快来救我嘛!同学,帮我贴一下手机模嘛!噗噗,这次又来了,同学,帮我写一下代码嘛!可是,你知道嘛,就算是学计算机的不就应该天天上着数学课,做着数学题,这关代码屁事啊!!!

好在代码不难。啪啪啪(此处为机械键盘码代码的声音)写好发给她,同学怎么用啊?啪啪啪写好说明,同学怎么不是老师那个样子?啪啪啪改好界面!同学,同学?同学已死,有事烧纸,没事请看代码:

吐槽完之后简直不能更爽!那位同学如是说,要让老师能够检测到同学们是否在自己的电脑上插了U盘,呼呼,无非是c/s下的U盘检测了,然后在写客户端时消息的回调函数那里需要注意,因为回调函数是全局函数,所以里面如果访问到外面的变量时,请注意是否还是自己心中想象的那个样子。服务器为了一直检测,直接用了一个死循环,一直接受客户端的连接,直接上代码吧:

客户端部分:

//#include <stdio.h>#include <WinSock2.h>#include <Windows.h>#include <Dbt.h>#include <time.h>#include <string.h>#pragma comment(lib, "ws2_32.lib")const int BUF_SIZE = 64;charbuf[BUF_SIZE] ;//接收数据缓冲区char disk_time[20];void UseUDiskTime(){    time_t Curtime;    tm sTime = {0};    time(&Curtime);    memset(disk_time,0,20);    tm *RetTime = localtime( &Curtime );    sprintf(disk_time," Date: %04d-%02d-%02d %02d:%02d:%02d "            ,RetTime->tm_year + 1900            ,RetTime->tm_mon + 1             ,RetTime->tm_mday            ,RetTime->tm_hour            ,RetTime->tm_min            ,RetTime->tm_sec);}char FirstDriveFromMask(ULONG unitmask){char i;for(i=0;i<26;i++){if(unitmask & 0x1)break;unitmask = unitmask >> 1;}return (i+'A');}int Disk_Span(char *buf){WSADATA         wsd;            //WSADATA变量  SOCKET          sHost;          //服务器套接字  SOCKADDR_IN     servAddr;       //服务器地址  int  retVal;         //返回值 if (WSAStartup(MAKEWORD(2,2), &wsd) != 0){printf("WSAStartup failed:%d\n",GetLastError());return -1;}//创建套接字sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(INVALID_SOCKET == sHost){printf("socker failed:%d\n",GetLastError());//printf("socket failed\n");WSACleanup();//释放套接字资源return  -1;}//设置服务器地址servAddr.sin_family =AF_INET;servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");servAddr.sin_port = htons((short)4999);int nServAddlen  = sizeof(servAddr);//连接服务器retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));if(SOCKET_ERROR == retVal){printf("connect failed:%d\n",GetLastError());//printf("connect failed!\n");closesocket(sHost);//关闭套接字WSACleanup();//释放套接字资源return -1;}retVal = send(sHost, buf, strlen(buf), 0);if (SOCKET_ERROR == retVal){printf("send failed:%d\n",GetLastError());closesocket(sHost);//关闭套接字WSACleanup();//释放套接字资源return -1;}closesocket(sHost);//关闭套接字WSACleanup();//释放套接字资源}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){memset(buf,0,BUF_SIZE);switch (message){case WM_DESTROY:PostQuitMessage(0);break;case WM_DEVICECHANGE:if(wParam == DBT_DEVICEARRIVAL){PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;//printf("Drive %c has arrived\n ",FirstDriveFromMask(lpdbv->dbcv_unitmask));sprintf(buf,"Drive %c has arrived...",FirstDriveFromMask(lpdbv->dbcv_unitmask));UseUDiskTime(); strcat(buf,disk_time); Disk_Span(buf); } else if(wParam == DBT_DEVICEREMOVECOMPLETE){ PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; //memset(buf,0,BUF_SIZE); sprintf(buf,"Drive %c has get away...",FirstDriveFromMask(lpdbv->dbcv_unitmask)); UseUDiskTime(); strcat(buf,disk_time); Disk_Span(buf); } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0;}int main(){    WNDCLASS wc;    ZeroMemory(&wc, sizeof(wc));    wc.lpszClassName = TEXT("usb_detection");    wc.lpfnWndProc = WndProc;         RegisterClass(&wc);    HWND h = CreateWindow(TEXT("usb_detection"), TEXT(""), 0, 0, 0, 0, 0,        0, 0, GetModuleHandle(0), 0);    MSG msg; printf("Welcome to use USB_Detection System...\n\tchecking...");  while( GetMessage(&msg, 0, 0, 0) > 0 ) {              TranslateMessage(&msg);              DispatchMessage(&msg);          } //退出return 0;}
服务器部分:

#include <stdio.h>//#include <tchar.h>#include "winsock2.h"  #pragma comment(lib, "ws2_32.lib")    int main(){    const int BUF_SIZE = 64;      WSADATA wsd;            //WSADATA变量      SOCKET sServer;        //服务器套接字      SOCKET sClient;        //客户端套接字      SOCKADDR_IN addrServ;;      //服务器地址      char buf[BUF_SIZE];  //接收数据缓冲区      char sendBuf[BUF_SIZE];//返回给客户端得数据      int retVal;         //返回值      int num = 0;//使用次数    //初始化套结字动态库      if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)      {  printf("WSAStartup failed:%d\n",WSAGetLastError());        return 1;      }            //创建套接字      sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);          if(INVALID_SOCKET == sServer)      {  printf("socket failed:%d\n",GetLastError());         WSACleanup();//释放套接字资源;          return  -1;      }            //服务器套接字地址       addrServ.sin_family = AF_INET;      addrServ.sin_port = htons(4999);      addrServ.sin_addr.s_addr = INADDR_ANY;            //绑定套接字      retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));        if(SOCKET_ERROR == retVal)      {     printf("bind failed:%d\n",GetLastError());        closesocket(sServer);   //关闭套接字          WSACleanup();           //释放套接字资源;          return -1;      }            //开始监听       retVal = listen(sServer, 1);      if(SOCKET_ERROR == retVal)      {  printf("listen failed:%d\n",GetLastError());         closesocket(sServer);   //关闭套接字          WSACleanup();           //释放套接字资源;          return -1;      }            //接受客户端请求      sockaddr_in addrClient;      int addrClientlen = sizeof(addrClient);      /*sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);      if(INVALID_SOCKET == sClient)      {  printf("accept failed:%d\n",GetLastError());         closesocket(sServer);   //关闭套接字          WSACleanup();           //释放套接字资源;          return -1;      }  */            while(true){   sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);       if(INVALID_SOCKET == sClient)       {  printf("accept failed:%d\n",GetLastError());                closesocket(sServer);   //关闭套接字          WSACleanup();           //释放套接字资源;          return -1;       }          //接收客户端数据          memset(buf,0,BUF_SIZE);          retVal = recv(sClient, buf, BUF_SIZE, 0);          if (SOCKET_ERROR == retVal)          {      printf("recv failed:%d\n",GetLastError());            closesocket(sServer);   //关闭套接字              closesocket(sClient);   //关闭套接字                   WSACleanup();           //释放套接字资源;              return -1;          }          if(buf[0] != '\0')  {printf("From Client IP:[%s]   Use USB for %d\n\t%s\n",inet_ntoa(addrClient.sin_addr),++num,buf);}        }            //退出      closesocket(sServer);   //关闭套接字      closesocket(sClient);   //关闭套接字      WSACleanup();           //释放套接字资源;      return 0;}

最后效果差不多是这个样子:

我兴冲冲的把代码发过去之后,又满怀欣喜的开始为别人的手机贴起了膜来



0 0
原创粉丝点击