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
- c/s模式下的U盘检测
- c/s模式下的文字滚动
- C/S模式下的打印方法
- win10下u盘检测的到,但是盘符不显示
- SOCKET编程c/s模式(阻塞模式下的)
- U盘检测的程序
- C/S模式下的数据翻页的效果
- linux下U盘状态检测
- linux下u盘检测程序
- 从C/S模式下的三层架构说起
- 从C/S模式下的三层架构说起
- C/S模式下程式更新的另類方法
- 从C/S模式下的三层架构说起
- 从C/S模式下的三层架构说起
- C/S,B/S模式的区别
- PHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!
- Domino下C/S与B/S模式的区别与优劣
- C/S模式下鼠标钩子
- WEB 生产环境的 Linux iptables 设置脚本
- android AIDL详解
- RabbitMq安装快速教程
- raw_input()和input() 的却别和用法
- 【随手写】BAT脚本之获取N天前日期
- c/s模式下的U盘检测
- 新的一年,云计算领域那些依旧“丰满”的理想
- OJ刷题之求三角形面积
- lua 字符串模式匹配
- VM下reahat9.0使用记录
- Highcharts一些属性
- linux shell通配符和正则表达式
- linux增加快捷键打开或关闭触摸板
- Genymotion安装配置