主頁 > 軟體工程 > 【急問】哪位大神教我下,在MFC下如何檢查某個IP地址是否是連接狀態? [問題點數:30分]

【急問】哪位大神教我下,在MFC下如何檢查某個IP地址是否是連接狀態? [問題點數:30分]

2020-09-21 16:36:10 軟體工程

如題,有沒有簡單快速的方法,之前沒做過這方便的,有好的方法給分啦

uj5u.com熱心網友回復:

我是MFC新手,看網上說可以用SHELLEXEC呼叫Ping來做這個,不知道具體怎么實作

uj5u.com熱心網友回復:

netstat -n 這樣的?

uj5u.com熱心網友回復:

參考 2 樓 Eleven的回復:
netstat -n 這樣的?

不是,比如我要ping 192.168.1.1,怎么才能知道是ping通了還是沒有ping通,要在mfc里實作

uj5u.com熱心網友回復:

就是實作CMD命令模式下 發送ping 命令  接識訓復的碼

uj5u.com熱心網友回復:

int i=0;
NetworkTest *networktest = (NetworkTest *)pParam;
networktest->m_pinglist.ResetContent();
// 創建ICMP回顯請求包
// char *ICMPPack;
// ICMPPack=new char[networktest->packet];
while (networktest->m_stop)//networktest->m_index
{
char ICMPPack[1024] = {0} ; 
PICMP_HEADER pICMPHeader = (PICMP_HEADER)ICMPPack ;
pICMPHeader->bType = 8 ;
pICMPHeader->bCode = 0 ;
pICMPHeader->nId = (USHORT)::GetCurrentProcessId() ;
pICMPHeader->nCheckSum = 0 ;
pICMPHeader->nTimeStamp = 0 ;

memset ( (&ICMPPack[ICMP_HEADER_SIZE]), 'E',ICMP_HEADER_SIZE + networktest->m_packet) ; // 填充資料部分,內容任意 
// 初始化WinSock庫
WORD wVersionRequested = MAKEWORD( 2, 2 );
WSADATA wsaData;
if ( WSAStartup( wVersionRequested, &wsaData ) != 0 )
return FALSE ;

// 創建原始套接字
SOCKET RawSock = socket ( AF_INET, SOCK_RAW, IPPROTO_ICMP ) ;
if ( RawSock == INVALID_SOCKET )
{
return FALSE ;
}

// 設定接收超時為1秒
int nTimeout = networktest->m_time ;
int ret = ::setsockopt ( RawSock, SOL_SOCKET,SO_RCVTIMEO, (char*)&nTimeout, sizeof(nTimeout));

char szRecvBuf [ DEF_BUF_SIZE] ;
SOCKADDR_IN SourSockAddr ;


SOCKADDR_IN DestSockAddr ;
DestSockAddr.sin_family = AF_INET;
inet_addr(networktest->szDestIp);
DestSockAddr.sin_addr.s_addr = inet_addr(networktest->szDestIp) ;
DestSockAddr.sin_port = htons ( 0 ) ;
char m_str_start[128];
if(networktest->index_stop==true)
{
networktest->m_pinglist.ResetContent();
wsprintf(m_str_start,"正在ping [%s]",networktest->szDestIp);
networktest->m_pinglist.AddString(m_str_start);
networktest->index_stop=false;

}
pICMPHeader->nCheckSum = 0 ; // 初始時校驗值為0
pICMPHeader->nSequence = i ; // 序號
pICMPHeader->nTimeStamp = ::GetTickCount() ;// 當前時間

// 計算校驗值,校驗值要在ICMP資料報創建完才能計算
pICMPHeader->nCheckSum = networktest->GetCheckSum ( (LPBYTE)ICMPPack, ICMP_HEADER_SIZE + networktest->m_packet  ) ;//

// 發送ICMP資料包
int nRet = ::sendto ( RawSock, ICMPPack, ICMP_HEADER_SIZE + networktest->m_packet,0,(SOCKADDR*)&DestSockAddr, sizeof(DestSockAddr) ) ;//
if ( nRet == SOCKET_ERROR )
{
networktest->m_pinglist.AddString ( "sendto error!\n" ) ;
return FALSE ;
}

// 接收ICMP回應
int nLen = sizeof(SourSockAddr) ;
nRet = ::recvfrom ( RawSock, szRecvBuf, DEF_BUF_SIZE,0,(SOCKADDR*)&SourSockAddr, &nLen ) ;
if ( nRet == SOCKET_ERROR )
{
if ( ::WSAGetLastError() == WSAETIMEDOUT )
{
networktest->m_pinglist.AddString ( "Request Timeout\n" ) ;
continue ;
}
else
{
networktest->m_pinglist.AddString ( "recvfrom error!\n" ) ;
return FALSE ;
}
}

// 計算ICMP資料報的時間差
int nTime = ::GetTickCount() - pICMPHeader->nTimeStamp ;

int nRealSize = nRet - IP_HEADER_SIZE - ICMP_HEADER_SIZE ;
if ( nRealSize < 0  )
{
networktest->m_pinglist.AddString ( "To less recv bytes!\n" );
continue ;
}

// 檢測是否當前所發出的ICMP回應包
PICMP_HEADER pRecvHeader = (PICMP_HEADER)(szRecvBuf+IP_HEADER_SIZE);

CString str_all;
CString m_TTL;

if(networktest->m_check1.GetCheck())
{
m_TTL.Format("TTL=%d",nRet);
}
else
m_TTL="";
CString m_replaytime;
if(networktest->m_check2.GetCheck())
{
m_replaytime.Format("time=%dms ",nTime);

}
else
m_replaytime="";
CString m_packetsize;
if(networktest->m_check3.GetCheck())
{
m_packetsize.Format("bytes=%d ",nRealSize);

}
else
m_packetsize="";
CString m_ipreplay;
if(networktest->m_check4.GetCheck())
{
m_ipreplay.Format("replay[%d] from %s :",networktest->m_index,inet_ntoa(SourSockAddr.sin_addr));
}
else
m_ipreplay="";
str_all=m_ipreplay+m_packetsize+m_replaytime+m_TTL;
networktest->m_index++;
networktest->m_pinglist.AddString(str_all);
networktest->UpdateWindow();//立馬重繪顯示
Sleep(1000) ;//
i++;
closesocket(RawSock) ;
WSACleanup();
}//回圈

uj5u.com熱心網友回復:

僅供參考:
#include <windows.h>
#include <stdio.h>
#include <string.h>
char YN(int k) {
    FILE *f;
    char fn[40];
    char ln[80];
    char yn;
    int n;

    yn='N';
    sprintf(fn,"d:\\ping%d.txt",k);
    f=fopen(fn,"r");
    if (NULL!=f) {
        n=0;
        while (1) {
            if (NULL==fgets(ln,80,f)) break;//
            if (strstr(ln,"ms ")) {
                yn='Y';
                break;//
            }
            n++;
            if (n>=4) break;//
        }
        fclose(f);
    }
    return yn;
}
void main(int argc,char **argv) {
    char cmdstr[256];
    int i;
    int IP[3];
    char c;

    if (argc<2) {
    USAGE:
        printf("Usage example:\n    %s 192.168.60.\nto test 192.168.60.1-254\n",argv[0]);
        return;
    }
    if (4==sscanf(argv[1],"%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&c)) {
        if (0<=IP[0] && IP[0]<=255
         && 0<=IP[1] && IP[1]<=255
         && 0<=IP[2] && IP[2]<=255
         && '.'==c) {
            for (i=1;i<255;i++) {
                sprintf(cmdstr,"cmd /c ping %s%d -n 1 -w 1000 >d:\\ping%d.txt",argv[1],i,i);
                WinExec(cmdstr,SW_HIDE);
            }
            Sleep(3000);
            for (i=1;i<255;i++) {
                printf("%c %s%d\n",YN(i),argv[1],i);
            }
            Sleep(3000);
            WinExec("cmd /c del /q d:\\ping*.txt",SW_HIDE);
        } else goto USAGE;
    } else goto USAGE;
}

uj5u.com熱心網友回復:

正解在這里:

方案1、自己寫ping函式。這樣成功或失敗就很容易分析了吧。
方案2、如果你非要用CMD的ping命令,那么,給你的建議是使用管道技術。就是創建一個緩沖區,將子行程ping命令的輸出轉向到你的緩沖區,然后分析緩沖區內的文本即可。同時還可以隱藏ping視窗。

uj5u.com熱心網友回復:

參考 7 樓 sdhexu 的回復:
正解在這里:

方案1、自己寫ping函式。這樣成功或失敗就很容易分析了吧。
方案2、如果你非要用CMD的ping命令,那么,給你的建議是使用管道技術。就是創建一個緩沖區,將子行程ping命令的輸出轉向到你的緩沖區,然后分析緩沖區內的文本即可。同時還可以隱藏ping視窗。


管道技術請自行百度,下面的供參考。很久以前寫的。

啟動一個Windows控制臺行程,并將其輸出轉向。
截獲目標行程輸出的方式:
1、等待目標行程結束后讀取緩沖區,并更新。
2、隨時讀取緩沖區并追加更新到指定輸出。(但每次讀之前需要清除緩沖區,否則輸出重疊)


unsigned long SomeThread( LPVOID pVoid )
{
char Buffer [ 4096 ];
DWORD dwExit = 1;
HANDLE hReadPipe = NULL;
HANDLE hWritePipe = NULL;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof( SECURITY_ATTRIBUTES );
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
CString szCurPath  = pDlg->GetFilePath();
STARTUPINFO StartupInfo = { sizeof(StartupInfo) };
PROCESS_INFORMATION ProcessInfo = { 0 };
TCHAR szCommandLine[ 256 ]; // = _T("c:\\windows\\system32\\cmd.exe /c dir");
_tcscpy_s( szCommandLine, 256, ( szCurPath + _T("VPNRel.EXE")));
ZeroMemory( Buffer, 4096 );

if( ! CreatePipe( &hReadPipe, &hWritePipe, &sa, 0 ))
{
  goto EXIT_THREAD;
}
StartupInfo.cb = sizeof( STARTUPINFO );
GetStartupInfo( &StartupInfo );
StartupInfo.hStdError = hWritePipe;
StartupInfo.hStdOutput = hWritePipe;
StartupInfo.wShowWindow = SW_HIDE;
StartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

if( ! CreateProcess( NULL, szCommandLine, NULL, NULL, TRUE, 0, NULL, szCurPath, &StartupInfo, &ProcessInfo ))
{
  goto EXIT_THREAD;
}
//    - 創建目標行程成功,開始等待目標行程結束并監視其輸出
// ----------------------------目標行程輸出-------------------------------

CloseHandle( hWritePipe );
hWritePipe = NULL;
while( dwExit )
{
  DWORD dwWait = WaitForSingleObject( ProcessInfo.hProcess, 200 );
  DWORD dwReaded;
  ZeroMemory( Buffer, sizeof( Buffer )); // Cleaer Buffer.
  if( ReadFile( hReadPipe, Buffer, 4095, &dwReaded, NULL ) == false )
  {
   if( dwWait == WAIT_TIMEOUT )
    continue;
   else
    break;
  }
  else
  {
#ifdef _UNICODE
   TCHAR szWBuffer[ 4096 ];
   ZeroMemory( szWBuffer, sizeof( TCHAR ) * 4096 );
   MultiByteToWideChar( CP_ACP, 0, Buffer, -1, szWBuffer, 4095 );
   APPEND( szWBuffer );  // ==  m_strSomeEdit += szWBuffer; UpdateData( false );
#else
   APPEND( Buffer ); // ==  m_strSomeEdit += Buffer; UpdateData( false );
#endif
  }
  if( dwWait == WAIT_OBJECT_0 )
   break;
}
//--------------------------目標行程已經結束------------------------------
EXIT_THREAD:
if( ProcessInfo.hProcess != NULL )
  CloseHandle( ProcessInfo.hProcess );
if( hWritePipe != NULL )
  CloseHandle( hWritePipe );
if( hReadPipe != NULL )
  CloseHandle( hReadPipe );
pDlg->m_hThread = NULL;
return 0;

uj5u.com熱心網友回復:

參考 8 樓 sdhexu的回復:
Quote: 參考 7 樓 sdhexu 的回復:

正解在這里:

方案1、自己寫ping函式。這樣成功或失敗就很容易分析了吧。
方案2、如果你非要用CMD的ping命令,那么,給你的建議是使用管道技術。就是創建一個緩沖區,將子行程ping命令的輸出轉向到你的緩沖區,然后分析緩沖區內的文本即可。同時還可以隱藏ping視窗。


管道技術請自行百度,下面的供參考。很久以前寫的。

啟動一個Windows控制臺行程,并將其輸出轉向。
截獲目標行程輸出的方式:
1、等待目標行程結束后讀取緩沖區,并更新。
2、隨時讀取緩沖區并追加更新到指定輸出。(但每次讀之前需要清除緩沖區,否則輸出重疊)


unsigned long SomeThread( LPVOID pVoid )
{
char Buffer [ 4096 ];
DWORD dwExit = 1;
HANDLE hReadPipe = NULL;
HANDLE hWritePipe = NULL;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof( SECURITY_ATTRIBUTES );
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
CString szCurPath  = pDlg->GetFilePath();
STARTUPINFO StartupInfo = { sizeof(StartupInfo) };
PROCESS_INFORMATION ProcessInfo = { 0 };
TCHAR szCommandLine[ 256 ]; // = _T("c:\\windows\\system32\\cmd.exe /c dir");
_tcscpy_s( szCommandLine, 256, ( szCurPath + _T("VPNRel.EXE")));
ZeroMemory( Buffer, 4096 );

if( ! CreatePipe( &hReadPipe, &hWritePipe, &sa, 0 ))
{
  goto EXIT_THREAD;
}
StartupInfo.cb = sizeof( STARTUPINFO );
GetStartupInfo( &StartupInfo );
StartupInfo.hStdError = hWritePipe;
StartupInfo.hStdOutput = hWritePipe;
StartupInfo.wShowWindow = SW_HIDE;
StartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

if( ! CreateProcess( NULL, szCommandLine, NULL, NULL, TRUE, 0, NULL, szCurPath, &StartupInfo, &ProcessInfo ))
{
  goto EXIT_THREAD;
}
//    - 創建目標行程成功,開始等待目標行程結束并監視其輸出
// ----------------------------目標行程輸出-------------------------------

CloseHandle( hWritePipe );
hWritePipe = NULL;
while( dwExit )
{
  DWORD dwWait = WaitForSingleObject( ProcessInfo.hProcess, 200 );
  DWORD dwReaded;
  ZeroMemory( Buffer, sizeof( Buffer )); // Cleaer Buffer.
  if( ReadFile( hReadPipe, Buffer, 4095, &dwReaded, NULL ) == false )
  {
   if( dwWait == WAIT_TIMEOUT )
    continue;
   else
    break;
  }
  else
  {
#ifdef _UNICODE
   TCHAR szWBuffer[ 4096 ];
   ZeroMemory( szWBuffer, sizeof( TCHAR ) * 4096 );
   MultiByteToWideChar( CP_ACP, 0, Buffer, -1, szWBuffer, 4095 );
   APPEND( szWBuffer );  // ==  m_strSomeEdit += szWBuffer; UpdateData( false );
#else
   APPEND( Buffer ); // ==  m_strSomeEdit += Buffer; UpdateData( false );
#endif
  }
  if( dwWait == WAIT_OBJECT_0 )
   break;
}
//--------------------------目標行程已經結束------------------------------
EXIT_THREAD:
if( ProcessInfo.hProcess != NULL )
  CloseHandle( ProcessInfo.hProcess );
if( hWritePipe != NULL )
  CloseHandle( hWritePipe );
if( hReadPipe != NULL )
  CloseHandle( hReadPipe );
pDlg->m_hThread = NULL;
return 0;


你的正解,雖然我找到方法了,還是很感謝各位回帖的大神

uj5u.com熱心網友回復:

參考 5 樓 像我這么屌的還有六個的回復:
int i=0;
NetworkTest *networktest = (NetworkTest *)pParam;
networktest->m_pinglist.ResetContent();
// 創建ICMP回顯請求包
// char *ICMPPack;
// ICMPPack=new char[networktest->packet];
while (networktest->m_stop)//networktest->m_index
{
char ICMPPack[1024] = {0} ; 
PICMP_HEADER pICMPHeader = (PICMP_HEADER)ICMPPack ;
pICMPHeader->bType = 8 ;
pICMPHeader->bCode = 0 ;
pICMPHeader->nId = (USHORT)::GetCurrentProcessId() ;
pICMPHeader->nCheckSum = 0 ;
pICMPHeader->nTimeStamp = 0 ;

memset ( (&ICMPPack[ICMP_HEADER_SIZE]), 'E',ICMP_HEADER_SIZE + networktest->m_packet) ; // 填充資料部分,內容任意 
// 初始化WinSock庫
WORD wVersionRequested = MAKEWORD( 2, 2 );
WSADATA wsaData;
if ( WSAStartup( wVersionRequested, &wsaData ) != 0 )
return FALSE ;

// 創建原始套接字
SOCKET RawSock = socket ( AF_INET, SOCK_RAW, IPPROTO_ICMP ) ;
if ( RawSock == INVALID_SOCKET )
{
return FALSE ;
}

// 設定接收超時為1秒
int nTimeout = networktest->m_time ;
int ret = ::setsockopt ( RawSock, SOL_SOCKET,SO_RCVTIMEO, (char*)&nTimeout, sizeof(nTimeout));

char szRecvBuf [ DEF_BUF_SIZE] ;
SOCKADDR_IN SourSockAddr ;


SOCKADDR_IN DestSockAddr ;
DestSockAddr.sin_family = AF_INET;
inet_addr(networktest->szDestIp);
DestSockAddr.sin_addr.s_addr = inet_addr(networktest->szDestIp) ;
DestSockAddr.sin_port = htons ( 0 ) ;
char m_str_start[128];
if(networktest->index_stop==true)
{
networktest->m_pinglist.ResetContent();
wsprintf(m_str_start,"正在ping [%s]",networktest->szDestIp);
networktest->m_pinglist.AddString(m_str_start);
networktest->index_stop=false;

}
pICMPHeader->nCheckSum = 0 ; // 初始時校驗值為0
pICMPHeader->nSequence = i ; // 序號
pICMPHeader->nTimeStamp = ::GetTickCount() ;// 當前時間

// 計算校驗值,校驗值要在ICMP資料報創建完才能計算
pICMPHeader->nCheckSum = networktest->GetCheckSum ( (LPBYTE)ICMPPack, ICMP_HEADER_SIZE + networktest->m_packet  ) ;//

// 發送ICMP資料包
int nRet = ::sendto ( RawSock, ICMPPack, ICMP_HEADER_SIZE + networktest->m_packet,0,(SOCKADDR*)&DestSockAddr, sizeof(DestSockAddr) ) ;//
if ( nRet == SOCKET_ERROR )
{
networktest->m_pinglist.AddString ( "sendto error!\n" ) ;
return FALSE ;
}

// 接收ICMP回應
int nLen = sizeof(SourSockAddr) ;
nRet = ::recvfrom ( RawSock, szRecvBuf, DEF_BUF_SIZE,0,(SOCKADDR*)&SourSockAddr, &nLen ) ;
if ( nRet == SOCKET_ERROR )
{
if ( ::WSAGetLastError() == WSAETIMEDOUT )
{
networktest->m_pinglist.AddString ( "Request Timeout\n" ) ;
continue ;
}
else
{
networktest->m_pinglist.AddString ( "recvfrom error!\n" ) ;
return FALSE ;
}
}

// 計算ICMP資料報的時間差
int nTime = ::GetTickCount() - pICMPHeader->nTimeStamp ;

int nRealSize = nRet - IP_HEADER_SIZE - ICMP_HEADER_SIZE ;
if ( nRealSize < 0  )
{
networktest->m_pinglist.AddString ( "To less recv bytes!\n" );
continue ;
}

// 檢測是否當前所發出的ICMP回應包
PICMP_HEADER pRecvHeader = (PICMP_HEADER)(szRecvBuf+IP_HEADER_SIZE);

CString str_all;
CString m_TTL;

if(networktest->m_check1.GetCheck())
{
m_TTL.Format("TTL=%d",nRet);
}
else
m_TTL="";
CString m_replaytime;
if(networktest->m_check2.GetCheck())
{
m_replaytime.Format("time=%dms ",nTime);

}
else
m_replaytime="";
CString m_packetsize;
if(networktest->m_check3.GetCheck())
{
m_packetsize.Format("bytes=%d ",nRealSize);

}
else
m_packetsize="";
CString m_ipreplay;
if(networktest->m_check4.GetCheck())
{
m_ipreplay.Format("replay[%d] from %s :",networktest->m_index,inet_ntoa(SourSockAddr.sin_addr));
}
else
m_ipreplay="";
str_all=m_ipreplay+m_packetsize+m_replaytime+m_TTL;
networktest->m_index++;
networktest->m_pinglist.AddString(str_all);
networktest->UpdateWindow();//立馬重繪顯示
Sleep(1000) ;//
i++;
closesocket(RawSock) ;
WSACleanup();
}//回圈

這是模擬Ping的底層實作嗎

uj5u.com熱心網友回復:

管道技術加上createprocess可以解決

uj5u.com熱心網友回復:

樓上的大佬們能講下ping的缺陷嗎,為何還需要開行程設緩沖區呢?擔心ping對程式主執行緒有影響可以開個執行緒來ping,這樣有什么缺陷呢?

uj5u.com熱心網友回復:

參考 12 樓 qq_32008381 的回復:
樓上的大佬們能講下ping的缺陷嗎,為何還需要開行程設緩沖區呢?擔心ping對程式主執行緒有影響可以開個執行緒來ping,這樣有什么缺陷呢?

參考《Unix編程藝術》

uj5u.com熱心網友回復:

檢查IP地址是否在線,和是否連接到本機是不同的兩個概念。

建議擼主先了解清楚了需求再提問。

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/98300.html

標籤:網絡編程

上一篇:VS2017 C++入門

下一篇:MFC中,DTP日歷控制元件,顯示內容可以改成英文的嗎在中文系統

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more