、“網(wǎng)絡監(jiān)視器”的基本使用
目前創(chuàng)新互聯(lián)已為成百上千的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)絡空間、網(wǎng)站托管維護、企業(yè)網(wǎng)站設計、雙清網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
欲打開“網(wǎng)絡監(jiān)視器”,只需依次選擇“開始→程序→附件→系統(tǒng)工具→網(wǎng)絡監(jiān)視器”即可進入其主窗口。
對于“網(wǎng)絡監(jiān)視器”中的功能,既可以選擇菜單中的相應項目,也可以通過直接單擊工具欄上的相應按鈕來實現(xiàn)。在其主窗口工具欄上的按鈕,從左到右作用依次為:
1.選擇服務器:通過它可對其他計算機的“網(wǎng)絡監(jiān)視器”進行遠程管理。具體的使用方法請參見后文相關內(nèi)容。
2.斷開用戶連接:通過它可強行中斷列表中指定用戶對本機的連接。
3.關閉文件:通過它可強行關閉列表中指定用戶所打開的指定共享文件。
4.添加共享:通過它可根據(jù)提示直接添加本機的共享資源,并為它設置相應權(quán)限。
5.停止共享:通過它可停止列表中指定資源的共享。
6.顯示用戶:這相當于選“查看”菜單中的“按連接”項,它是“網(wǎng)絡監(jiān)視器”主窗口的默認狀態(tài),也是最常用的窗口。此處可以查看到已連接到本機的客戶機的用戶名、計算機名、打開了些什么共享資源、打開些什么文件以及連接的時間和空閑的時間等資料。當客戶機斷開連接之后它就會自動從此列表中消失。
7.顯示共享的文件夾:這相當于選“查看”菜單中的“按共享的文件夾”項。它可以查看本機已共享的資源及其共享名和權(quán)限;可添加共享,停止共享,修改共享等。
8、顯示文件:這相關于選“查看”菜單中的“按打開的文件”項。它可以查看已打開的本服務器文件;可關閉文件等。
三、“網(wǎng)絡監(jiān)視器”的遠程監(jiān)視
本文上面部分已經(jīng)講過“網(wǎng)絡監(jiān)視器”在本地計算機上的基本使用方法,但實際上在一定條件滿足的情況下,它也可以對局域網(wǎng)內(nèi)的其他計算機進行完全相同的遠程管理。請進行如下的操作:
1.啟用遠程管理
在遠程計算機上,先進入其“控制面板→密碼→遠程管理”窗口,再勾選中“啟用此服務器的遠程管理”,接著在相應位置輸入密碼后按“確定”按鈕保存退出。
2.使用遠程管理
在本地計算機上,先進入“網(wǎng)絡監(jiān)視器”的主窗口,再選“管理員”菜單中的“選擇服務器”項,在“請輸入要進行管理的服務器名”的提示窗口中的“名稱”處輸入遠程計算機的名字(比如為zhuyan),然后按“確定”按鈕繼續(xù);系統(tǒng)接著會提示“必須提供密碼才能連接”,則請在“密碼”后輸入“啟用遠程管理”一步中所設的密碼值,最后按“確定”按鈕即可得到新的“網(wǎng)絡監(jiān)視器”的窗口,里面當然是遠程計算機的共享內(nèi)容了,你所要做的,就是進行正常操作就可以啦!
注意:
1.如果在“使用遠程管理”操作中,當進行到輸入密碼一步勾選中了“請將密碼保存到密碼列表”項,則當你以后再連接到遠程計算機時就不用輸入密碼了。
2.如果要想修改共享文件夾名或其權(quán)限設置,則需要在“顯示共享的文件夾”窗口中,先在列表中選中該用戶,然后按鍵盤上的ALT+ENTER鍵(或者選“管理員”菜單中的“共享文件夾的屬性”項),再根據(jù)提示進行操作即可。
只是幫你調(diào)好的程序代碼,你想做什么沒搞明白,不懂,希望對你有幫助
看注釋,修改你的程序就好了
static int readStat(int pid, struct statStuff *s)
{
const char *format = "%d %d %ld ";
char buf[256];
FILE *proc;
sprintf(buf,"/proc/%d/stat",pid);
proc = fopen(buf,"r");
if (proc) {
if (3==fscanf(proc, format, s-pid, s-tpgid, s-cutime)) //ERR:42??%d %d %ld , 最后多一個逗號
{
fclose(proc);
return 1;
} else {
fprintf(stderr, "no data in file:%s\n" , buf );
fclose(proc);
return 0;
}
} else {
fprintf(stderr, "can't open %s\n",buf);
return 0;
}
}
static int readStatm(int pid, struct statmStuff *s)
{
const char *format = "%lu %lu";
char buf[256];
FILE *proc;
sprintf(buf,"/proc/%d/statm",pid);
proc = fopen(buf,"r");
if (proc) {
if (2==fscanf(proc, format, s-size, s-data) ) //ERR:7??? %lu %lu
{
fclose(proc);
return 1;
} else {
fprintf(stderr, "no data in file:%s\n" , buf );
fclose(proc);
return 0;
}
} else {
fprintf(stderr, "can't open %s\n",buf);
return 0;
}
}
int main()
{
int pid;
pid=fork();
if(pid==0) //ERR:==比較
{
execlp( "ls" , "ls" , "-l" , "/" ); //沒有exec函數(shù),不知道你的makefile干什么,這里舉一個ls命令
}
else
while(1){
struct statStuff stat;
struct statmStuff statm;
if (readStat(pid,stat)) //ERR:ppid?
{
printf("stat is\n");
printStat(stdout,stat);
catStat(stdout,pid,"stat"); //ERR:ppid?
//pkill掉大于1cpu秒,fork超過10次及stdout多于50行的程序,輸出給stderr
} else {
printf("didn't get stat\n");
}
if (readStatm(pid,statm)) //ERR:ppid?
{
printf("statm is\n");
printStatm(stdout,statm);
catStat(stdout,pid,"statm"); //ERR:ppid?
//處理heap或stack大于4096kb的程序,輸出給stderr
} else {
printf("didn't get statm\n");
}
getchar();
}
return 0;
}
這篇文章主要介紹了C/C++ 監(jiān)控磁盤與目錄操作的示例,幫助大家更好的理解和學習C/C++編程,感興趣的朋友可以了解下
遍歷磁盤容量:
#include stdio.h
#include Windows.h
void GetDrivesType(const char* lpRootPathName)
{
UINT uDriverType = GetDriveType(lpRootPathName);
switch (uDriverType)
{
case DRIVE_UNKNOWN:puts("未知磁盤"); break;
case DRIVE_NO_ROOT_DIR: puts("路徑無效"); break;
case DRIVE_REMOVABLE: puts("可移動磁盤"); break;
case DRIVE_FIXED: puts("固定磁盤"); break;
case DRIVE_REMOTE: puts("網(wǎng)絡磁盤"); break;
case DRIVE_CDROM: puts("光驅(qū)"); break;
case DRIVE_RAMDISK: puts("內(nèi)存映射盤"); break;
default: break;
}
}
void GetDrivesFreeSpace(const char* lpRootPathName)
{
unsigned long long available, total, free;
if (GetDiskFreeSpaceEx(lpRootPathName, (ULARGE_INTEGER*)available,
(ULARGE_INTEGER*)total, (ULARGE_INTEGER*)free))
{
printf("磁盤: %s | 總計: %lld MB 已用: %lld MB 剩余: %lld MB \n",
lpRootPathName, total 20, available 20, free 20);
}
}
int main(int argc,char *argv[])
{
DWORD dwSize = MAX_PATH;
char szLogicalDrives[MAX_PATH] = {0};
// 獲取邏輯驅(qū)動器號字符串
DWORD dwResult = GetLogicalDriveStringsA(dwSize, szLogicalDrives);
if (dwResult 0 dwResult = MAX_PATH) {
char* szSingleDrive = szLogicalDrives; // 從緩沖區(qū)起始地址開始
while (*szSingleDrive) {
//printf("Drive: %s\n", szSingleDrive); // 輸出單個驅(qū)動器的驅(qū)動器號
// GetDrivesType(szSingleDrive);
GetDrivesFreeSpace(szSingleDrive);
szSingleDrive += strlen(szSingleDrive) + 1; // 獲取下一個驅(qū)動器地址
}
}
system("pause");
return 0;
}
遍歷文件特定路徑:
循環(huán)遍歷文件路徑,并將文件后綴為.exe的路徑篩選出來.
#include stdio.h
#include windows.h
#include tlhelp32.h
void SearchFile(char *pszDirectory)
{
// 搜索指定類型文件
char *pszFileName = NULL;
char *pTempSrc = NULL;
WIN32_FIND_DATA FileData = { 0 };
// 申請動態(tài)內(nèi)存
pszFileName = new char[2048];
pTempSrc = new char[2048];
// 構(gòu)造搜索文件類型字符串 *.* 表示搜索所有文件類型
wsprintf(pszFileName, "%s\\*.*", pszDirectory);
HANDLE hFile = ::FindFirstFile(pszFileName, FileData);
if (INVALID_HANDLE_VALUE != hFile)
{
do
{
// 過濾掉當前目錄"." 和上一層目錄".."
if ('.' == FileData.cFileName[0])
continue;
// 拼接文件路徑
wsprintf(pTempSrc, "%s\\%s", pszDirectory, FileData.cFileName);
// 判斷是否是目錄還是文件
if (FileData.dwFileAttributes FILE_ATTRIBUTE_DIRECTORY)
SearchFile(pTempSrc); // 如果是目錄則繼續(xù)遞歸
else
{
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
_splitpath(pTempSrc, drive, dir, fname, ext);
// 如果是文件并且后綴為.exe則輸出具體路徑
if (strcmp(ext, ".exe") == 0)
printf("%s \n", pTempSrc);
}
} while (::FindNextFile(hFile, FileData));
}
FindClose(hFile);
delete[]pTempSrc;
delete[]pszFileName;
}
int main(int argc, char * argv[])
{
SearchFile("c:\\MinGW7");
system("pause");
return 0;
}
監(jiān)控文件目錄變化:
#include stdio.h
#include windows.h
#include tlhelp32.h
UINT MonitorFileThreadProc(LPVOID lpVoid)
{
char *pszDirectory = (char *)lpVoid;
// 打開目錄, 獲取文件句柄
HANDLE hDirectory = CreateFile(pszDirectory, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (INVALID_HANDLE_VALUE == hDirectory)
return 1;
char szFileName[MAX_PATH] = { 0 };
BOOL bRet = FALSE;
DWORD dwRet = 0;
DWORD dwBufferSize = 2048;
// 申請一個足夠大的緩沖區(qū)
BYTE *pBuf = new BYTE[dwBufferSize];
if (NULL == pBuf)
return 2;
FILE_NOTIFY_INFORMATION *pFileNotifyInfo = (FILE_NOTIFY_INFORMATION *)pBuf;
// 開始循環(huán)設置監(jiān)控
do
{
RtlZeroMemory(pFileNotifyInfo, dwBufferSize);
// 設置監(jiān)控目錄
bRet = ReadDirectoryChangesW(hDirectory, pFileNotifyInfo, dwBufferSize, TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME | // 修改文件名
FILE_NOTIFY_CHANGE_ATTRIBUTES | // 修改文件屬性
FILE_NOTIFY_CHANGE_LAST_WRITE, // 最后一次寫入
dwRet, NULL, NULL);
if (FALSE == bRet)
break;
// 將寬字符轉(zhuǎn)換成窄字符,寬字節(jié)字符串轉(zhuǎn)多字節(jié)字符串
WideCharToMultiByte(CP_ACP, 0, (wchar_t *)(pFileNotifyInfo-FileName),
(pFileNotifyInfo-FileNameLength / 2),szFileName,MAX_PATH,NULL,NULL);
// 將路徑與文件連接成完整文件路徑
char FullFilePath[1024] = { 0 };
strncpy(FullFilePath, pszDirectory, strlen(pszDirectory));
strcat(FullFilePath, szFileName);
// 判斷操作類型并顯示
switch (pFileNotifyInfo-Action)
{
case FILE_ACTION_ADDED:
printf("文件被 [創(chuàng)建]: %s \n", FullFilePath); break;
case FILE_ACTION_REMOVED:
printf("文件被 [刪除]: %s \n", FullFilePath); break;
case FILE_ACTION_MODIFIED:
printf("文件被 [修改]: %s \n", FullFilePath); break;
case FILE_ACTION_RENAMED_OLD_NAME:
printf("文件被 [重命名]: %s \n", FullFilePath); break;
}
} while (bRet);
CloseHandle(hDirectory);
delete[] pBuf;
pBuf = NULL;
return 0;
}
int main(int argc, char * argv[])
{
char *pszDirectory = "C:\\";
// 創(chuàng)建線程開始監(jiān)控
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MonitorFileThreadProc, pszDirectory, 0, NULL);
while (1)
{
Sleep(10000);
}
system("pause");
return 0;
}
監(jiān)控目錄文件變化:
可以將其改為一個簡單的文件防篡改程序,也可以用來監(jiān)控病毒的行為.
#include stdio.h
#include Windows.h
#include tlhelp32.h
DWORD WINAPI MonitorFileThreadProc(LPVOID lParam)
{
char *pszDirectory = (char *)lParam;
BOOL bRet = FALSE;
BYTE Buffer[1024] = { 0 };
FILE_NOTIFY_INFORMATION *pBuffer = (FILE_NOTIFY_INFORMATION *)Buffer;
DWORD dwByteReturn = 0;
HANDLE hFile = CreateFile(pszDirectory, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (INVALID_HANDLE_VALUE == hFile)
return 1;
while (TRUE)
{
ZeroMemory(Buffer, sizeof(Buffer));
// 設置監(jiān)控目錄回調(diào)函數(shù)
bRet = ReadDirectoryChangesW(hFile,Buffer,sizeof(Buffer),TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME | // 修改文件名
FILE_NOTIFY_CHANGE_ATTRIBUTES | // 修改文件屬性
FILE_NOTIFY_CHANGE_LAST_WRITE, // 最后一次寫入
dwByteReturn, NULL, NULL);
if (TRUE == bRet)
{
char szFileName[MAX_PATH] = { 0 };
// 將寬字符轉(zhuǎn)換成窄字符,寬字節(jié)字符串轉(zhuǎn)多字節(jié)字符串
WideCharToMultiByte(CP_ACP,0,pBuffer-FileName,(pBuffer-FileNameLength / 2),
szFileName,MAX_PATH,NULL,NULL);
// 將路徑與文件連接成完整文件路徑
char FullFilePath[1024] = { 0 };
strncpy(FullFilePath, pszDirectory, strlen(pszDirectory));
strcat(FullFilePath, szFileName);
switch (pBuffer-Action)
{
case FILE_ACTION_ADDED:
{
printf("添加: %s \n", FullFilePath); break;
}
case FILE_ACTION_REMOVED:
{
printf("刪除: %s \n", FullFilePath); break;
}
case FILE_ACTION_MODIFIED:
{
printf("修改: %s \n", FullFilePath); break;
}
case FILE_ACTION_RENAMED_OLD_NAME:
{
printf("重命名: %s", szFileName);
if (0 != pBuffer-NextEntryOffset)
{
FILE_NOTIFY_INFORMATION *tmpBuffer = (FILE_NOTIFY_INFORMATION *)
((DWORD)pBuffer + pBuffer-NextEntryOffset);
switch (tmpBuffer-Action)
{
case FILE_ACTION_RENAMED_NEW_NAME:
{
ZeroMemory(szFileName, MAX_PATH);
WideCharToMultiByte(CP_ACP,0,tmpBuffer-FileName,
(tmpBuffer-FileNameLength / 2),
szFileName,MAX_PATH,NULL,NULL);
printf(" - %s \n", szFileName);
break;
}
}
}
break;
}
case FILE_ACTION_RENAMED_NEW_NAME:
{
printf("重命名(new): %s \n", FullFilePath); break;
}
}
}
}
CloseHandle(hFile);
return 0;
}
int main(int argc, char * argv[])
{
char *pszDirectory = "C:\\";
HANDLE hThread = CreateThread(NULL, 0, MonitorFileThreadProc, pszDirectory, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
return 0;
}
以上就是C/C++ 監(jiān)控磁盤與目錄操作的示例的詳細內(nèi)容