windows 程序设计之「NetTime.C」范例分析笔记

网络时间同步实用工具NetTime NetTime是一个跨平台的网络时间同步实用程序,其目的是为了简化网络中的时间同步过程。在这一章节中,我们将深入探讨NetTime的基本功能、用户界面,以及与其他NTP客户端软件的对比。NetTime软件不仅可以轻松地将本地计算机的时间与网络上多个NTP服务器的时间进行同步,还能提供时间同步历史记录、本地时间源的选择以及其他时间管理工具。NetTime的用户界面简洁直观,非常适合进行日常的时间同步操作。 阅读详情

/*-------------------------------------------------------

   NETTIME.C -- Sets System Clock from Internet Services

                (c) Charles Petzold, 1998

  -------------------------------------------------------*/

 

#include <windows.h>

#include "resource.h"

 

#define WM_SOCKET_NOTIFY (WM_USER + 1)

#define ID_TIMER         1

 

LRESULT CALLBACK WndProc   (HWND, UINT, WPARAM, LPARAM) ;

BOOL    CALLBACK MainDlg   (HWND, UINT, WPARAM, LPARAM) ;

BOOL    CALLBACK ServerDlg (HWND, UINT, WPARAM, LPARAM) ;

 

void ChangeSystemTime (HWND hwndEdit, ULONG ulTime) ;

void FormatUpdatedTime (HWND hwndEdit, SYSTEMTIME * pstOld,

                                       SYSTEMTIME * pstNew) ;

void EditPrintf (HWND hwndEdit, TCHAR * szFormat, ...) ;

 

HINSTANCE hInst ;

HWND      hwndModeless ;

 

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

                    PSTR szCmdLine, int iCmdShow)

{

     static TCHAR szAppName[] = TEXT ("NetTime") ;

     HWND         hwnd ;

     MSG          msg ;

     RECT         rect ;

     WNDCLASS     wndclass ;

 

     hInst = hInstance ;

 

     wndclass.style         = 0 ;

     wndclass.lpfnWndProc   = WndProc ;

     wndclass.cbClsExtra    = 0 ;

     wndclass.cbWndExtra    = 0 ;

     wndclass.hInstance     = hInstance ;

     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;

     wndclass.hCursor       = NULL ;

     wndclass.hbrBackground = NULL ;

     wndclass.lpszMenuName  = NULL ;

     wndclass.lpszClassName = szAppName ;

 

     if (!RegisterClass (&wndclass))

     {

          MessageBox (NULL, TEXT ("This program requires Windows NT!"),

                      szAppName, MB_ICONERROR) ;

          return 0 ;

     }

    

     hwnd = CreateWindow (szAppName, TEXT ("Set System Clock from Internet"),

                          WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU |

                               WS_BORDER | WS_MINIMIZEBOX,

                          CW_USEDEFAULT, CW_USEDEFAULT,

                          CW_USEDEFAULT, CW_USEDEFAULT,

                          NULL, NULL, hInstance, NULL) ;

 

          // 创建模态对话框

     hwndModeless = CreateDialog (hInstance, szAppName, hwnd, MainDlg) ;

 

     // 获取模态对话框大小

     GetWindowRect (hwndModeless, &rect) ;

     // 该函数依据所需客户矩形的大小,计算需要的窗口矩形的大小

     // 参数二 指定将被计算尺寸的窗口的窗口风格

     // 参数三 指定窗口是否拥有菜单

     AdjustWindowRect (&rect, WS_CAPTION | WS_BORDER, FALSE) ;

     // 该函数改变一个子窗口,弹出式窗口或顶层窗口的尺寸,位置和Z序

     // SWP_NOMOVE:维持当前位置(忽略参数三、四)

     // 该函数更改程序主窗口大小,以保证能被hwndModeless对话框覆盖

     SetWindowPos (hwnd, NULL, 0, 0, rect.right - rect.left,

                   rect.bottom - rect.top, SWP_NOMOVE) ;

     // 该函数设置指定窗口的显示状态

     // SW_SHOW 在窗口原来的位置以原来的尺寸激活和显示窗口

     ShowWindow (hwndModeless, SW_SHOW) ;

     // 显示程序主窗口

     ShowWindow (hwnd, iCmdShow) ;

     UpdateWindow (hwnd) ;

 

          // Normal message loop when a modeless dialog box is used.

 

     while (GetMessage (&msg, NULL, 0, 0))

     {

          if (hwndModeless == 0 || !IsDialogMessage (hwndModeless, &msg))

          {

               TranslateMessage (&msg) ;

               DispatchMessage (&msg) ;

          }

     }

     return msg.wParam ;

}

 

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     switch (message)

     {

     case WM_SETFOCUS: // 传递焦点

          SetFocus (hwndModeless) ;

          return 0 ;

 

     case WM_DESTROY:

          PostQuitMessage (0) ;

          return 0 ;

     }

     return DefWindowProc (hwnd, message, wParam, lParam) ;

}

 

BOOL CALLBACK MainDlg (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     static char   szIPAddr[32] = { "132.163.135.130" } ;

     static HWND   hwndButton, hwndEdit ;

     static SOCKET sock ;

     static struct sockaddr_in sa ;

     static TCHAR  szOKLabel[32] ;

     int           iError, iSize ;

     unsigned long ulTime ;

     WORD          wEvent, wError ;

     WSADATA       WSAData ;    

 

     switch (message)

     {

     case WM_INITDIALOG:

         // 获取对话框窗口中指定控件的句柄

          hwndButton = GetDlgItem (hwnd, IDOK) ;

          hwndEdit = GetDlgItem (hwnd, IDC_TEXTOUT) ;

          return TRUE ;

 

     case WM_COMMAND:

          switch (LOWORD (wParam))

          {

          case IDC_SERVER: // 点击服务器列表按钮时

              // 创建模态对话框,用于显示服务器列表

              // 该对话框的回调函数为ServerDlg,自定义传递参数为szIPAddr(用于获取服务器IP)

               DialogBoxParam (hInst, TEXT ("Servers"), hwnd, ServerDlg,

                               (LPARAM) szIPAddr) ;

               return TRUE ;

 

          case IDOK:

               // WSAStartup 函数完成对Winsock服务的初始化

               // 第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本。

               // MAKEWORD 宏创建一个被指定变量连接而成的WORD变量。返回一个WORD变量。参数一为低8位。

               // WSAData 用于装载操作系统利用第二个参数返回请求的Socket的版本信息

               // 返回值 0 表示成功

               if (iError = WSAStartup (MAKEWORD(2,0), &WSAData))

               {

                   // 如果有错误代码返回,则在文本控件中显示错误代码

                    EditPrintf (hwndEdit, TEXT ("Startup error #%i./r/n"),

                                          iError) ;

                    return TRUE ;

               }

               // WSAData.szDescription 记录了获取的Winsock简要信息

               EditPrintf (hwndEdit, TEXT ("Started up %hs/r/n"),

                                     WSAData.szDescription);

 

         // socket 函数创建一个能够进行网络通信的套接字

         // AF_INET 指定应用程序使用的通信协议的协议族.表示此处是某种Internet地址

         // SOCK_STREAM 指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据封包套接字类型为SOCK_DGRAM

         // IPPROTO_TCP 指定应用程序所使用的通信协议。

         // 调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET

               sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP) ;

 

               if (sock == INVALID_SOCKET)

               {

                    EditPrintf (hwndEdit,

                                TEXT ("Socket creation error #%i./r/n"),

                                // 获得上次失败操作的错误代码

                                WSAGetLastError ()) ;

                    // 中止Windows Sockets DLL的使用

                    WSACleanup () ;

                    return TRUE ;

               }

               // 显示创建的套接字的描述符

               EditPrintf (hwndEdit, TEXT ("Socket %i created./r/n"), sock) ;

 

               // WSAAsyncSelect函数强制阻碍性的函数转为非阻碍性的,即在函数执行完之前把控制权传回给程序

               // WM_SOCKET_NOTIFY 程序自订消息,当满足触发条件时,由系统发送给参数二指定的窗口处理程序

               // FD_CONNECT 设置触发条件,欲接收已连接好时。

               // FD_READ 设置触发条件,欲接收读准备好时。

               // 返回值 0 表示成功

               if (SOCKET_ERROR == WSAAsyncSelect (sock, hwnd, WM_SOCKET_NOTIFY,

                                                   FD_CONNECT | FD_READ))

               {

                    EditPrintf (hwndEdit,

                                TEXT ("WSAAsyncSelect error #%i./r/n"),

                                WSAGetLastError ()) ;

                    // 该函数关闭一个套接口,它释放套接口描述符sock

                    closesocket (sock) ;

                    WSACleanup () ;

                    return TRUE ;

               }

              

               // AF_INET 用于表示地址种类,此处是某种Internet地址

               sa.sin_family           = AF_INET ;

   // sin_port 指定为欲连接的端口

   // 当大多数数字通过Internet时,这个端口号字段必须是(big-endian)的,即最高的字节排第一个。

   // Intel微处理器是little endian ,低位在前。所以用htons将一个无符号短整型数值转换为网络字节序,即(big-endian)

               sa.sin_port             = htons (IPPORT_TIMESERVER) ;

               // inet_addr函数将储存在szIPAddr字符串中的服务器地址转化为无正负号长整数

               sa.sin_addr.S_un.S_addr = inet_addr (szIPAddr) ;

 

  // 建立与一个端的连接

  // 由于之前呼叫了WSAAsyncSelect,所以connect不会等待连结,它会立即传回SOCKET_ERROR的值。

  // 这并不是出现了错误,这只是表示现在还没有联机成功而已。当连接成功或失败时,会触发WM_SOCKET_NOTIFY消息

               connect(sock, (SOCKADDR *) &sa, sizeof (sa)) ;

 

               /* WSAEWOULDBLOCK 表示 Output Buffer 已经满了,无法再写入数据。

                  可以理解为当程序发送数据给对方,对方的接收速度没有程序发送的快或者对方的接受缓冲区已被填满,

                  所以就返回一个“忙”的标志,而这时程序再发多少数据都没任何意义,这时系统就抛出该异常通知。*/

               if (WSAEWOULDBLOCK != (iError = WSAGetLastError ()))

               {

                    EditPrintf (hwndEdit, TEXT ("Connect error #%i./r/n"),

                                          iError) ;

                    closesocket (sock) ;

                    WSACleanup () ;

                    return TRUE ;

               }

               // 显示正在连接服务器

               EditPrintf (hwndEdit, TEXT ("Connecting to %hs..."), szIPAddr) ;

 

               // 设置一个定时器,用于打印“.”

               SetTimer (hwnd, ID_TIMER, 1000, NULL) ;

               // 获取hwndButton按钮的文字,保存到szOKLabel缓冲区

               GetWindowText (hwndButton, szOKLabel, sizeof (szOKLabel) /

                                                     sizeof (TCHAR)) ;

               // 更改hwndButton按钮的文字。

               SetWindowText (hwndButton, TEXT ("Cancel")) ;

               // GWL_ID 设置一个新的窗口标识符

               SetWindowLong (hwndButton, GWL_ID, IDCANCEL) ;

               return TRUE ;

 

               // 取消连接被点击时

          case IDCANCEL:

               closesocket (sock) ;

               sock = 0 ;

               WSACleanup () ;

               SetWindowText (hwndButton, szOKLabel) ;

               SetWindowLong (hwndButton, GWL_ID, IDOK) ;

 

               KillTimer (hwnd, ID_TIMER) ;

               EditPrintf (hwndEdit, TEXT ("/r/nSocket closed./r/n")) ;

               return TRUE ;

 

               // 点击关闭窗口时

          case IDC_CLOSE:

               if (sock)

                    SendMessage (hwnd, WM_COMMAND, IDCANCEL, 0) ;

               // GetParent 函数获得一个指定子窗口的父窗口句柄

               DestroyWindow (GetParent (hwnd)) ;

               return TRUE ;

          }

          return FALSE ;

 

     case WM_TIMER:

          EditPrintf (hwndEdit, TEXT (".")) ;

          return TRUE ;

 

          // WSAAsyncSelect函数中的自订消息

     case WM_SOCKET_NOTIFY:

          // 低字组包含了当前消息的触发条件

          wEvent = WSAGETSELECTEVENT (lParam) ;   // ie, LOWORD

          // 高字组包含了错误代码,0表示没有错误

          wError = WSAGETSELECTERROR (lParam) ;   // ie, HIWORD

 

               // Process two events specified in WSAAsyncSelect

 

          switch (wEvent)

          {

              // 当连接成功或失败时

          case FD_CONNECT:

               EditPrintf (hwndEdit, TEXT ("/r/n")) ;

               // 判断是否为连接失败

               if (wError)

               {

                    EditPrintf (hwndEdit, TEXT ("Connect error #%i."),

                                          wError) ;

                    SendMessage (hwnd, WM_COMMAND, IDCANCEL, 0) ;

                    return TRUE ;

               }

               EditPrintf (hwndEdit, TEXT ("Connected to %hs./r/n"), szIPAddr) ;

 

   /* 试图从一个套接口接收数据

      sock 已连接上的套接口的描述符

      ulTime 用于接收数据的缓冲区

      4 缓冲区长度

      MSG_PEEK 指定数据将被复制到缓冲区中,但并不从输入队列中删除。

      由于之前呼叫了WSAAsyncSelect,recv并不等待接收,而是立即传回错误代码,表示函数通常受阻,但这时没有受阻。

      理论上来说(但由于网络延迟所以不大可能),函数至少能传回数据的一部分,然后再次呼叫以获得其余的32个字节值。

      这就是呼叫recv函数时带有MSG_PEEK选项的原因。

      当服务器端准备好,程序可以接收数据时,将再次触发WM_SOCKET_NOTIFY消息,并包含FD_READ值 */

               recv (sock, (char *) &ulTime, 4, MSG_PEEK) ;

               EditPrintf (hwndEdit, TEXT ("Waiting to receive...")) ;

               return TRUE ;

              

               // 当可以接收数据时

          case FD_READ:

               KillTimer (hwnd, ID_TIMER) ;

               EditPrintf (hwndEdit, TEXT ("/r/n")) ;

               // 做错误检测

               if (wError)

               {

                    EditPrintf (hwndEdit, TEXT ("FD_READ error #%i."),

                                          wError) ;

                    SendMessage (hwnd, WM_COMMAND, IDCANCEL, 0) ;

                    return TRUE ;

               }

 

               // 正式接收时间数据,最后的参数是0,用于从队列中删除数据

               // 返回值 若无错误发生,返回读入的字节数。如果连接已中止,返回0。否则的话,返回SOCKET_ERROR错误

               iSize = recv (sock, (char *) &ulTime, 4, 0) ;

               // ntohl 将一个无符号长整形数从网络字节顺序转换为计算机字节顺序。

               ulTime = ntohl (ulTime) ;

               // 接收的32位的ulTime值是从1900年1月1日0:00开始的UTC秒数,但是为(big-endian)字序

               EditPrintf (hwndEdit,

                           TEXT ("Received current time of %u seconds ")

                           TEXT ("since Jan. 1 1900./r/n"), ulTime) ;

 

               // 更改系统时间,发送取消连接消息

               ChangeSystemTime (hwndEdit, ulTime) ;

               SendMessage (hwnd, WM_COMMAND, IDCANCEL, 0) ;

               return TRUE ;

          }

          return FALSE ;

     }

     return FALSE ;

}

 

BOOL CALLBACK ServerDlg (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     static char * szServer ;

     static WORD   wServer = IDC_SERVER1 ;

     char          szLabel [64] ;

 

     switch (message)

     {

     case WM_INITDIALOG:

          // 保存服务器IP传递缓冲区

          szServer = (char *) lParam ;

          // 该函数给一组单选按钮中的一个指定按钮加上选中标志,并且清除组中其他按钮的选中标志

          // 默认情况下所有的单选按钮都在一个组内

          CheckRadioButton (hwnd, IDC_SERVER1, IDC_SERVER10, wServer) ;

          return TRUE ;

 

     case WM_COMMAND:

          switch (LOWORD (wParam))

          {

          case IDC_SERVER1:

          case IDC_SERVER2:

          case IDC_SERVER3:

          case IDC_SERVER4:

          case IDC_SERVER5:

          case IDC_SERVER6:

          case IDC_SERVER7:

          case IDC_SERVER8:

          case IDC_SERVER9:

          case IDC_SERVER10:

              // 保存选中的单选按钮标识符

               wServer = LOWORD (wParam) ;

               return TRUE ;

 

          case IDOK:

               // 获取选中的单选按钮的文本到szLabel缓冲区

               GetDlgItemTextA (hwnd, wServer, szLabel, sizeof (szLabel)) ;

            // 分解字符串为一组字符串,首次调用时,参数一指向要分解的字符串,之后再次调用要把参数一设成NULL

            // 参数二为分隔符字符串,函数在szLabel中查找包含在参数二中的字符并用NULL来替换,直到找遍整个字符串。

            // 成功执行后,szLabel被分割成了N个NULL隔开的字符串组。szLabel指向第一个分隔符后的字符串首地址。

            // 该函数已被strsep函数替代。

               strtok (szLabel, "(") ;

               // strtok 的第二次调用,从"("之后的第一个字符开始执行分割。返回值正好为IP地址字符串

               // 然后复制IP地址,到用于传递的缓冲区中。

               strcpy (szServer, strtok (NULL, ")")) ;

               EndDialog (hwnd, TRUE) ;

               return TRUE ;

 

          case IDCANCEL:

               EndDialog (hwnd, FALSE) ;

               return TRUE ;

          }

          break ;

     }

     return FALSE ;

}

 

void ChangeSystemTime (HWND hwndEdit, ULONG ulTime)

{

     FILETIME      ftNew ;

     LARGE_INTEGER li ;

     SYSTEMTIME    stOld, stNew ;

     // 该函数用来获取本机当前系统日期和时间

     GetLocalTime (&stOld) ;

 

     stNew.wYear         = 1900 ;

     stNew.wMonth        = 1 ;

     stNew.wDay          = 1 ;

     stNew.wHour         = 0 ;

     stNew.wMinute       = 0 ;

     stNew.wSecond       = 0 ;

     stNew.wMilliseconds = 0 ;

     // 该函数根据参数一的数据,填写FILETIME结构

     // FILETIME结构实际上只是由两个32位的DWORD一起组成64位的整数;

     // 用来表示从1601年1月1日至参数一中的时间间隔为100纳秒(nanosecond,十亿分之一秒)的间隔数。

     SystemTimeToFileTime (&stNew, &ftNew) ;

     // 将ftNew地址强制转换为LARGE_INTEGER类型的指针,再解除引用

     // LARGE_INTEGER 是一个union,允许64位的值可以被当成两个32位的值使用;

     // 或者当成一个__int64数据型态的64位整数使用(__int64数据型态是Microsoft编译器对ANSI C标准的扩充)。

     li = * (LARGE_INTEGER *) &ftNew ;

     // ulTime值是从1900年1月1日0:00开始的UTC秒数,乘以一千万倍。

     // li.QuadPart 最终等于1601年1月1日至ulTime时间,间隔为100纳秒的间隔数

     li.QuadPart += (LONGLONG) 10000000 * ulTime ;

     ftNew = * (FILETIME *) &li ;

     // 将作为最终计算结果的FILETIME值转换回SYSTEMTIME结构

     FileTimeToSystemTime (&ftNew, &stNew) ;

 

     // 设置当前系统的时间和日期;执行成功,返回值为TRUE,如果发生了错误,则返回FALSE。

     // 调用者必须具有SE_SYSTEMTIME_NAME权限,函数的执行才会成功.

     if (SetSystemTime (&stNew))

     {

         // 获取系统新的时间,和之前的旧时间一同发送给自定义函数,用于显示更新状态

          GetLocalTime (&stNew) ;

          FormatUpdatedTime (hwndEdit, &stOld, &stNew) ;

     }

     else

         // 执行失败时,显示错误消息

          EditPrintf (hwndEdit, TEXT ("Could NOT set new date and time.")) ;

}

 

void FormatUpdatedTime (HWND hwndEdit, SYSTEMTIME * pstOld, SYSTEMTIME * pstNew)

{

     TCHAR szDateOld [64], szTimeOld [64], szDateNew [64], szTimeNew [64] ;

     // 针对指定的“当地”格式,对一个系统日期进行格式化

     // 参数一 用于决定格式的地方ID。参数四中指定的任何信息(倘若不是NULL)都优先于特定于地方的信息

     // LOCALE_USER_DEFAULT 指定使用用户或进程的默认区域设置,该常数的值为0x0400

     // 参数二 如指定了lpFormat,该参数应该为零。否则可设为LOCALE_NOUSEROVERRIDE,强制使用系统地方参数;

     // DATE_SHORTDATE 或 DATE_LONGDATE 用于选择不同的日期格式

     // pstOld 包含了一个系统日期的结构

     // 参数四 用于指定使用特定于不同地方的值;例如d,dd,ddd,dddd或m,mm,mmm,mmmm或y,yy,yyyy这样的字符串

     // szDateOld 指定一个缓冲区,用于容纳格式化过后的字串

     // 最后是缓冲区的长度

     GetDateFormat (LOCALE_USER_DEFAULT, LOCALE_NOUSEROVERRIDE | DATE_SHORTDATE,

                    pstOld, NULL, szDateOld, sizeof (szDateOld)) ;

 

     // 针对指定的“当地”格式,对一个系统时间进行格式化

     // TIME_NOTIMEMARKER 表示不使用时间标记;例如"AM"和"PM"

     // TIME_FORCE24HOURFORMAT 表示始终使用24小时时间格式

     GetTimeFormat (LOCALE_USER_DEFAULT, LOCALE_NOUSEROVERRIDE |

                         TIME_FORCE24HOURFORMAT | TIME_NOTIMEMARKER ,

                    pstOld, NULL, szTimeOld, sizeof (szTimeOld)) ;

 

     GetDateFormat (LOCALE_USER_DEFAULT, LOCALE_NOUSEROVERRIDE | DATE_SHORTDATE,

                    pstNew, NULL, szDateNew, sizeof (szDateNew)) ;

    

     GetTimeFormat (LOCALE_USER_DEFAULT, LOCALE_NOUSEROVERRIDE |

                         TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT,

                    pstNew, NULL, szTimeNew, sizeof (szTimeNew)) ;

 

     // 显示更新前后时间信息

     EditPrintf (hwndEdit,

                 TEXT ("System date and time successfully changed ")

                 TEXT ("from/r/n/t%s, %s.%03i to/r/n/t%s, %s.%03i."),

                 szDateOld, szTimeOld, pstOld->wMilliseconds,

                 szDateNew, szTimeNew, pstNew->wMilliseconds) ;

}

 

void EditPrintf (HWND hwndEdit, TCHAR * szFormat, ...)

{

     TCHAR   szBuffer [1024] ;

     va_list pArgList ;

 

     va_start (pArgList, szFormat) ;

     wvsprintf (szBuffer, szFormat, pArgList) ;

     va_end (pArgList) ;

 

     SendMessage (hwndEdit, EM_SETSEL, (WPARAM) -1, (LPARAM) -1) ;

     SendMessage (hwndEdit, EM_REPLACESEL, FALSE, (LPARAM) szBuffer) ;

     SendMessage (hwndEdit, EM_SCROLLCARET, 0, 0) ;

}

 

 

R语言vegan包实战:用varpart函数搞定生态学VPA分析(附完整代码与数据集) 本文详细介绍了如何使用R语言vegan包中的varpart函数进行生态学方差分解分析(VPA),包括数据准备、模型构建、结果解读和可视化呈现。通过完整的代码示例和数据集,帮助研究者理解不同环境因子对生物群落变化的相对贡献,并掌握显著性检验等高级技巧。 阅读详情

相关推荐

sentaurus学习笔记(一)器件仿真

之前有跟大家说,以后转到sentaurus,因此silvaco会用的比较少,结果发现真的有一点贪心厌旧的感觉,现在基本上不用silvaco(lll¬ω¬)故这篇文章,将为大家带来的是关于sentaurus的结构仿真和器件的特性的提取。我们还是老规矩,先上结构图。 还是一个经典的IGBT结构,这是一个典型的N型IGBT,下面我将把一些相关的结构,和具体的写法用下面一幅图表达出来。 这里因为方便看,我们把器件的比例画的比较抽象。可以看到的是,这里有很多的距离参数是用一些变量名来写的,这也是sentaurus

weixin_43262021的博客 2万+

消息机制-WSAAsyncSelect

http://blog.sina.com.cn/s/blog_4bf793ad0100p665.html 消息机制-WSAAsyncSelect WSAAsyncSelect基于Windows消息机制异步I/O模型,为特定网络事件指

_Witch__的专栏 1357

zynq7020的arm A9核降频实录

zynq arm9 cortex a9 降频

qq_40011737的博客 8764

局域网ntp服务器设置(windows时间同步服务器NetTime)(ubuntu systemd-timesyncd ntp客户端)123端口、ntp校时、ntp同步(设置UDP入站流量绕过防火墙)

"pool.ntp.org"项目使用DNS轮询来分配各种时间服务器的流量,这意味着当你查询"pool.ntp.org"时,DNS服务器会返回该池中任意一个服务器的IP地址。这样,你就把你的Windows主机设为了NTP服务器。然而,如果你的网络不能访问互联网,那么你将无法使用这个地址,因为它需要通过互联网来访问NTP Pool的服务器。值4(二进制100)告诉W32Time服务,只有当本机是一个可靠的时间服务时(例如,它已经被配置为手动同步到一个硬件时钟或外部NTP服务器),才公布自己为时间服务器。

Dontla的博客 2万+

Raptor码(一):2007RFC5053标准编解码学习

RFC 5053 标准

a_beatiful_knife的博客 3493

【图像超分】论文复现:Pytorch实现ESPCN

论文精读:由于ESPCN没有公布源码,我们选择github上一个高star的项目来复现。准备数据集,以及数据预处理搭建网络模型设置参数并训练测试训练好的模型用训练好的模型测试自己的数据本文我们使用pycharm链接服务器训练。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1万+

windows下局域网内通过net time同步时间

需求:由于局域网中A计算机的时间每次重启都恢复成初始时间,电池换了也无济于事,并且想拥有准确的时间。方案:通过同步局域网中B计算机时间的方式,使A计算机时间准确。自行百度,不再赘述。

qq_52123071的博客 1930

Python爬虫实战:使用Scrapy+Playwright高效爬取全球专利数据库

本文将详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建一个高效的专利数据库爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、分布式爬虫架构以及数据存储方案,最终实现一个完整的专利数据采集系统。专利数据是技术创新领域的重要信息资源,包含技术描述、权利要求、申请人信息等宝贵数据。中国国家知识产权局(CNIPA)美国专利商标局(USPTO)欧洲专利局(EPO)世界知识产权组织(WIPO)

2201_76125261的博客 1382

NetTime——c++实现计算机时间与网络时间的更新

《Windows网络与通信程序设计》第二章的一个小例子,网络编程入门。 #include "stdafx.h" #include <WinSock2.h> #include <windows.h> #include <stdio.h> #include <iostream> #pragma comment(lib,"ws...

aijuzhou1959的博客 300

【架构】-- StarRocks 和 Doris 介绍与选型建议

查询性能 | ✅ 高性能,支持向量化执行和 CBO 优化器 | ✅ 高性能,优化的查询引擎 |- **实时性要求高**:如果业务对数据的实时性要求较高,建议选择 **StarRocks**,其在实时数据处理和低延迟查询方面表现优越。- **复杂查询需求**:对于需要处理复杂多表关联查询的场景,两者均可胜任,需根据具体性能测试结果进行选择。

欢迎来到我的博客,一起探索代码里的世界! 1831

YOLO11改进|卷积篇|引入SPDConv

YOLO11中添加SPDConv卷积

A1983Z的博客 3696

《Windows程序设计》读书笔二十三 尝试互联网

第二十三章 尝试互联网 23.1 Windows套接字 最早是给UNIX操作系统添加网络支持而开发的一个概念。也成为Berkeley socket interface 23.1.1 套接字和TCP/IP IP协议把数据封装成一个个数据包(Datagram),数据的来源和目的地信息都存放在数据报的报头中。 TCP则提供了一种可以对IP数据报进行可靠传输和错误检测的方法。

sesiria的博客 559

【系统架构设计师-2025上半年真题】综合知识-参考答案及详解(75题完全回忆版)

【系统架构设计师-2025上半年真题】案例分析-参考答案及部分详解

数据知道的博客 1万+

C基础学习笔记——第01天CMD命令

在学习C基础总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。 CMD命令: 开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本)chcp 修改默认字符集chcp 936默认中文chcp 650011. appwiz.cpl:程序和功能 2. calc:启动计算器 5. chkdsk.exe:Chkdsk...

Alliswell_WP 320

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Windows程序设计 第23章,套接字编程

// /*------------------------------------------------------- NETTIME.C -- Sets System Clock from Internet Services (c) Charles Petzold, 1998 -----------------------------------

-----------------------------不要在跟自己无关的事情上浪费时间 865

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

windows bat更改系统时间 & 同步internet时间

最近刚好用到一款软件学习版,30天试用期满,但是还想继续用,不具体透露是什么软件了。 发现更改了系统时间后,这个软件就又能启动了,不过每次改来改去很麻烦,就写了段脚本 @echo off date 11/1/2017 & time 13:13 cd C:\Program Files (x86)\ABC start ABC.exe ping 127.0.0.1 -n...

6663

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

windows 程序设计 套接字异步选择

/*------------------------------------------------------- NETTIME.C -- Sets System Clock from Internet Services (c) Charles Petzold, 1998 -----------------------------------------

软件开发 1287

命令行net time同步时间(内网)

首先还是推荐大家使用Internet时间来同步自己计算机的时间,这样做主要是方便,就是设置一个ntp服务器,我推荐下面的三个ntp服务器地址。 time.asia.apple.com  //亲测有效 asia.pool.ntp.org  //亲测有效 ntp.nict.jp  //亲测有效 如果上面的方法不可用,或者只有局域网,无法连接到互联网,可使用下面的方法: ...

weixin_30596735的博客 1770

net use使用方法

net use使用方法 2017-11-10 08:47:15Diamond 、阅读数 10220更多 分类专栏:cmd命令 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/baidu_27474941/article/details/78495974 建立到远程主机的连...

cxu123321的博客 549

windows2003常用命令大全

net user heibai lovechina /add                      加一个heibai的用户密码为lovechina net localgroup Administrators heibai /add        把他加入Administrator组net start telnet                                    开对方的

liutaoqqqq的专栏 980

编程小技巧 --用VB解决时间同步的问题

现在,许多C/S型的应用程序都要求客户机与服务器时间同步,大多数程序员用存储过程来解决这一问题,但存储过程编写起来有一定的难度。我在摸索中找到了一种方法,可以很好的解决这个问题。Windows XP/2000中有一个命令:nettime。这个命令是用来读取服务器的时间,将客户机的系统时间设置为服务器的时间。以后当我们需要调用服务器时间的时候,可以直接读取本地时间,而读取本地时间对我们来说是很容易的...

2354

windows 中渗透测试常用命令

windows 中渗透测试常用命令

Y525698136的博客 1260

渗透测试中常用WINDOWS命令

渗透测试中常用WINDOWS命令 ifconfig /all 获取获取域名、IP地址、DHCP服务器、网关、MAC地址、主机名 net time /domain 查看域名、时间 net view /domain 查看域内所有共享 net view ip 查看对方局域网内开启了哪些共享 net config workstation 查看域名、机器名等 net user 用户名 密码 /add 建立...

AdminTony的博客 791

net-命令详解

Net use net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user:"用户名" 建立IPC非空链接 net use h: \\ip\c$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H: net use h: \\ip\c$...

weixin_34071713的博客 153
上一篇: windows 程序设计之「RECORD2.C」范例分析笔记
下一篇: Win7下利用IIS架设WAP服务器,实现数据下载
TypeCool
博客等级 码龄22年 58粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值