Unix和Windows跨系统通讯编程

数据中心机房建设标准及依据 深刻理解、尊重并恪守这些依据,是我们以科学、经济、可靠的方式,为蓬勃发展的数字经济筑牢基石的唯一路径。让我们共同努力,以标准为依据,以匠心为精神,建造更多世界一流的高效能、高可用、高智能的绿色数据中心,共同赋能数字中国的宏伟事业,支撑中华民族在数字时代的伟大复兴征程中稳步前行!今天我将力图以宏大的视角和深入的剖析,系统性地阐述数据中心机房建设所应遵循的多层次、多维度的标准依据,揭示这些依据背后的深层逻辑与时代使命,并探讨其如何共同作用于一座世界级数据中心的诞生。,以支持万兆乃至更高速率的传输。 阅读详情

引自:http://blog.youkuaiyun.com/fashion1840/archive/2007/02/09/1506204.aspx

前言

  随着Internet的不断发展,客户机/服务器模型得到了广泛的应用。客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的端口监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被“惊醒”并且为客户提供服务或对客户的请求作出适当的反应。   Unix最早是由美国贝尔实验室发明的一种多用户、多任务的通用操作系统,由于 Unix具有技术成熟、可靠性高、网络和数据库功能强、伸缩性突出和开发性好的特色,可满足各行各业的实际需要,特别是企业重要业务的需要,已经成为主要的工作平台和重要的企业操作平台,而微软公司的 Windows操作系统用户界面友好,安装、使用也比较方便,应用软件丰富,在个人PC机上成为主流操作系统。因此服务端使用 Unix,客户端使用 Windows能充分利用它们各自的优点,这也是今后发展的一个趋势。

  同时,金融行业的中间业务发展迅速,银行主机采用 Unix系统,而各代收代付单位多采用 Windows或 WindowsNT系统,在它们之间传输数据文件也涉及跨系统通讯的问题,通过套接字 Socket能方便地实现 Unix和 Windows的跨系统通讯,本文拟就这一问题作一探讨。

  二、 SOCKET简介

  TCP/IP是计算机互连最常使用的网络通讯协议, TCP/IP的核心部分由网络操作系统的内核实现,应用程序通过编程接口来访问 TCP/IP,见下图:

图1 应用程序与Windows Socket关系图

  七十年代中,美国国防部高研署(DARPA)将TCP/IP的软件提供给加利福尼亚大学Berkeley分校后,TCP/IP很快被集成到Unix中,同时出现了许多成熟的TCP/IP应用程序接口(API)。这个API称为Socket接口。今天,SOCKET接口是TCP/IP网络最为通用的API,也是在INTERNET上进行应用开发最为通用的API。

  九十年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范。它是Berkeley Sockets的重要扩充,主要是增加了一些异步函数,并增加了符合 Windows 消息驱动特性的网络事件异步选择机制。 Windows Sockets规范是一套开放的、支持多种协议的 Windows下的网络编程接口。目前,在实际应用中的Windows Sockets规范主要有1.1版和2.0版。两者的最重要区别是1.1版只支持TCP/IP协议,而2.0版可以支持多协议,2.0版有良好的向后兼容性,目前,Windows下的Internet软件都是基于 WinSock开发的。

  Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。在应用开发中就像使用文件句柄一样,可以对 Socket句柄进行读、写操作。我们将 Socket翻译为套接字,套接字分为以下三种类型:

  字节流套接字(Stream Socket) 是最常用的套接字类型,TCP/IP协议族中的 TCP 协议使用此类接口。字节流套接口提供面向连接的(建立虚电路)、无差错的、发送先后顺序一致的、无记录边界和非重复的网络信包传输。

  数据报套接字 (Datagram Socket) TCP/IP协议族中的UDP协议使用此类接口,它是无连接的服务,它以独立的信包进行网络传输,信包最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点。数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。

  原始数据报套接字(Raw Socket) 提供对网络下层通讯协议(如IP协议)的直接访问,它一般不是提供给普通用户的,主要用于开发新的协议或用于提取协议较隐蔽的功能。

  三、 基于SOCKET的应用开发

图2 面向连接协议的SOCKET编程模型

  面向连接协议的SOCKET编程模型应用最为广泛,因为面向连接协议提供了一系列的数据纠错功能,可以保证在网络上传输的数据及时、无误地到达对方。基于连接协议(字节流套接字)的服务是设计客户机/服务器应用程序时的标准,其编程模型如下:

  尽管Windows Sockets和Berkeley Sockets都是TCP/IP应用程序的编程接口,但二者由于分属不同的系统,在某些环节仍有一些差别。Windows Sockets API没有严格地坚持Berkeley传统风格,通常这么做是因为在Windows环境中实现的难度。

  1.套接口数据类型和错误数值

   Windows Sockets规范中定义了一个新的数据类型 SOCKET,这一类型的定义对于将来Windows Sockets规范的升级是必要的。这一类型的定义保证了应用程序向Win32 环境的可移植性。因为这一类型会自动地从16位升级到32位。

  在 UNIX中,所有句柄包括套接口句柄,都是非负的短整数。 Windows Sockets 句柄则没有这一限制,除了INVALID_SOCKET 不是一个有效的套接口外,套接口可以取从0到 INVALID_SOCKET-1 之间的任意值。因为 SOCKET 类型是unsigned ,所以编译已经存在于UNIX 环境中的应用程序的源代码可能会导致 signed/unsigned 数据类型不匹配的警告。

  因此,在socket() 例程和accept() 例程返回时,检查是否有错误发生就不应该再使用把返回值和-1比较的方法,或判断返回值是否为负(这两种方法在BSD 中都是很普通,很合法的途径)。取而代之的是,一个应用程序应该使用常量INVALID_SOCKET ,该常量已在WINSOCK.H 中定义。

  例如:
  BDS 风格
  m_hSocket=socket(…);
  if(m_hSocket=-1)   /*or m_hSocket<0*/
    {…}
  Windows风格:
  m_hSocket=socket(…);
  if(m_hSocket=INVALID_SOCKET)
    {…}

  2.select() 函数和FD_*宏

  由于一个套接口不再表示为非负的整数,select() 函数在Windows Sockets API中的实现有一些变化:每一组套接口仍然用 fd_set 类型来代表,但是它并不是一个位掩码。

  typedef struct fd_set{
   u_int fd_count;
   SOCKET fd_array;
  } fd_set;

  整个组的套接口是用了一个套接口的数组来实现的。为了避免潜在的危险,应用程序应该坚持用FD_XXX 宏(FD_SET,FD_ZERO,FD_CLR,FD_ISSET)来设置,初始化,清除和检查fd_set 结构。

  3.错误代码-errno,h_errno,WSAGetLastError()

   Windows Sockets 实现所设置的错误代码是无法通过 errno 变量得到的。另外对于 getXbyY() 这一类的函数,错误代码无法从h _errno 变量得到,错误代码可以使用 WSAGetLastError()调用得到,这种改进是为了适应多线程程序设计的需要。WSAGetLastError()允许程序员能够得到对应于每一线程的最近的错误代码。

  为了保持与 BSD 的兼容性,应用程序可以加入以下一行代码:

  #define errno WSAGetLastError()

  这就保证了用全程的 errno 变量所写的网络程序代码在单线程环境中可以正确使用。当然,这样做有许多明显的缺点:如果一个源程序对套接口和非套接口函数都用 errno 变量来检查错误,那么这种机制将无法工作。此外,一个应用程序不可能为 errno 赋一个新的值 (在Windows Sockets 中,WSAGetLastError()函数可以做到这一点)。

  例如:
  BSD风格:
  retcode=recv(…);
  if(retcode=-1 && errno=EWOULDBLOCK)
  {…}
  Windows风格:
  retcode=recv(…);
  if(retcode=-1 && WSAGetLastError ()=EWOULDBLOCK)
  {…}

  虽然为了兼容性原因,错误常量与4.3BSD 所提供的一致:应用程序应该尽可能地使用“WSA”系列错误代码定义。且常量 SOCKET_ERROR是被用来检查API 调用失败的。虽然对这一常量的使用并不是强制性的,但这是推荐的。例如,上面程序更准确应该是:

  retcode=recv(…)
  if(retcode=SOCKET_ERROR&&WSAGetLastError()=
  WSAEWOULDBLOCK)
  {…}

  4.重命名的函数

  有两种原因Berkeley 套接口中的函数必须重命名,以避免与其他的 API 冲突:

  ① close() 和closesocket()
  在Berkeley套接口中,套接口出现的形式与标准文件描述字相同,所以 close() 函数可以用来象关闭文件一样关闭套接口。在Windows Sockets API中,套接字和正常文件句柄不是等同的,例如read(),write() 和close() 在应用于套接口后不能保证正确工作。套接口必须使用 closesocket()例程来关闭,用close() 例程来关闭套接口是不正确的。

  ② ioctl()和iooctlsocket()
  Windows Sockets定义ioctlsocket() 例程,用于实现 BSD中ioctl() 和fcntl() 的功能。

  5.阻塞例程和 EINPROGRESS 宏

  虽然Windows Sockets 支持关于套接口的阻塞操作,但是这种应用是被强烈反对的,如果程序员被迫使用阻塞模式(例如一个准备移植的已有的程序,BSD 包含了大量的阻塞函数,且其默认的工作方式都是阻塞的),那么他应该清楚地知道Windows Sockets中阻塞操作的语义。

  6.指针

  所有应用程序与Windows Sockets 使用的指针都必须是FAR 指针,为了方便应用程序开发者作用,Windows Sockets规范定义了数据类型LPHOSTENT 。

  7. Windows Sockets支持的最大套接口数目

  一个Windows Sockets 应用程序可以使用的套接口的最大数目是在编译时由常量 FD_SETSIZE 决定的。这个常量在 select() 函数中被用来组建fd_set 结构。在WINSOCK.H 中缺省值是64。如果一个应用程序希望能够使用超过64个套接口,则编程人员必须在每一个源文件包含 WINSOCK.H 前定义确切的FD_SETSIZE值。有一种方法可以完成这项工作,就是在工程项目文件中的编译器选项上加入这一定义。 FD_SETSIZE定义的值对Windows Sockets实现所支持的套接口的数目并无任何影响。

  8.头文件

  为了方便基于 Berkeley 套接口的已有的源代码的移植, Windows Sockets支持许多 Berkeley头文件。这些 Berkeley头文件被包含在WINSOCK.H中。所以一个 Windows Sockets应用程序只需简单的包含 WINSOCK.H就足够了(这也是一种被推荐使用的方法)。

  四、 跨系统通讯编程实例

  下面通过一个实例来具体说明 Socket 在Unix 和Windows 跨系统通讯编程中的应用。

  Internet 上可以提供一种叫 IRC(Internet Relay Chatting,Internet 在线聊天系统)的服务。使用者通过客户端的程序登录到 IRC 服务器上,就可以与登录在同一 IRC 服务器上的客户进行交谈,这也就是平常所说的聊天室。在这里,给出了一个在运行 TCP/IP 协议的网络上实现 IRC 服务的程序。其中,服务器运行在 SCO Open Server 5.0.5上,客户端运行在Windows98 或 Windows NT 上。

  在一台计算机上运行服务端程序,同一网络的其他计算机上运行客户端程序,登录到服务器上,各个客户之间就可以聊天了。

  1.服务端

  服务端用名为 client 的整型数组记录每个客户的已连接套接口描述字,此数组中的所有元素都初始化为-1。同时服务器既要处理监听套接口,又要处理所有已连接套接口,因此需要用到 I/O 复用。通过 select 函数内核等待多个事件中的任一个发生,并仅在一个或多个事件发生或经过某指定时间后才唤醒进程。维护一个读描述字集 rset ,当有客户到达时,在数组 client中的第一个可用条目(即值为-1的第一个条目)记录其已连接套接口的描述字。同时把这个已连接描述字加到读描述字集rset 中,变量maxi 是当前使用的数组 client 的最大下标,而变量 maxfd+1 是函数 select第一个参数的当前值。如下图:(假设有两个客户与服务器建立连接)

 

图3 第二客户建立连接后的TCP服务器

图4 第二客户建立连接后的数据结构

  服务器在指定的端口上监听,每当一个套接口接收到信息,都将会把接收到的信息发送给每一个Client 。其主要源程序如下:

  int main(int argc,char **argv)
  {
  int   i,maxi,maxfd,listenfd,connfd,sockfd;
  int   nready,client;
  ssize_t n;
  fd_set rset,allset;
  char line[MAXLNE];
  socklen_t clilen;
  struct sockaddr_in cliaddr,servaddr;
  const int on=1;
  listenfd=Socket(AF_INET,SOCK_STREAM,0);
  if(setsockopt (listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))=-1);    err_ret(″setsockopt error″);
  bzero(&servaddr,sizeof(servaddr));
  servaddr.sin_family =AF_INET;
  servaddr.sin_addr.s_addr =htonl(INADDR_ANY);
  servaddr.sin_port =htons(SERV_PORT);
  Bind(listenfd,(SA*)&servaddr,sizeof(servaddr));
  Listen(listenfd,LISTENQ);
  maxfd =listenfd; //初始化
  maxi = -1; //最大下标
  for(i=0;i<FD_SETSIZE;i++)
    client[i]=-1; //-1表示可用
  FD_ZERO(&allset);
  FD_SET(listenfd,&allset);
  for(;;){
   rset=allset; //结构赋值
    nready=Select(maxfd+1,&rset,NULL,NULL,NULL);
   if (FD_ISSET(listenfd,&rset)){ //有用户连接
    clilen=sizeof(cliaddr);
    connfd=Accept(listenfd,(SA*)&cliaddr,&clilen);
    for(i=0;i<FD_SETSIZE;i++)
      if(client[i]< 0 {
       client[i]=connfd;//保存套接字
       break;
      }
    if(i=FD_SETSIZE);
     err_quit(″too many clients″);
    FD_SET (connfd,&allset); //增加套接字到读描述字集
    if(connfd>maxfd);
      maxfd=connfd;
    if(i>maxi);
      maxi=i;
    if(--nready<=0)
     continue;
  }
  for (i=0;i<=maxi;i++){ //检查所有用户连接
    if((sockfd=client[i])<0)
     continue;
    if(FD_ISSET(sockfd,&rset))
{
     if((n=Readline(sockfd,line,MAXLINE))=0)
{               //用户关闭连接
       Close(sockfd);
       FD_CLR(sockfd,&allset);
       client[i]=-1
      }else
        printf(″%s″,line);
       Broadcast(client,maxi,line,n);
       if (--nready<=0)
         break;
        }
      }
    }
  }
  //将聊天内容发送到所有已连接的用户
  Broadcast(int client,int maxi,char*str,size_t n)
  {
      int i;
      int sockfd;
      for(i=0;i<maxi,i++){
       if((sockfd=client[i])<0)
       continue;
      writen(sockfd,str,n);
    }
  }

  2.客户端

  为了实现非阻塞通信,利用异步选择函数 WSAAsynSelect() 将网络事件与 WinSock 消息联系起来,由该函数注册一些用户感兴趣的网络事件(如接收缓冲区满,允许发送数据,请求连接等)。当这些被注册的网络事件发生时,应用程序的相应函数将接收到有关消息。

  应用程序在使用Windows Sockets DLL 之前必须先调用启动函数WSAStartup() ,该函数的功能有两点:一是由应用程序指定所要求Windows Sockets DLL 版本;二是获得系统 Windows Sockets DLL的一些技术细节。每一个WSAStartup()函数必须和一个WSACleanup()函数对应,当应用程序终止时,必须调用 WSACleanup()将自己从OLL 中注销。

  客户端程序用 VC++6.0在Windows98 操作系统下设计,程序主框架由 AppWizard 生成,客户端核心代码在 CTalkDialog类中。只有一个 socket 变量m_hSocket 与服务端进行连接。连接建立好后,通过此 SOCKET发送和接收信息。

  手工加入CTalkDialog::OnSockConnect() ,完成基本套接字编程,为客户程序申请一个套接字,并将该套接字与指定服务器绑定,然后向服务器发出连接请求,启动异步选择函数等待服务器的响应。

  void CTalkDialog:″OnSockConnect()
{
   struct sockaddr_in servaddr;
   WSADATA wsaData;
   if(WSAStartup(WINSOCK_VERSION,&wsaData));
   {
    MessageBox(″Could not load Windows Sockets DLL,″,NULL,MB_Ok);
    return;
  }
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
   memset(&servaddr,0,sizeof(servaddr));
   servaddr.sin_family=AF_INET;
   //m_iPort,m_csIP 为通过注册对话框返回的端口号和IP地址
  servaddr.sin_port=htons(m_iport);
  servaddr.sin_addr.S_un.S_addr=inet_addr(m_csIP);
  if (connect(m_hSocket,(SA*)& servaddr,sizeof (servaddr))!=0){
     AfxMessageBox(″连接服务器失败!″);
   GetDlgItem(IDC_BUTTON_OUT)->EnableWindow(FALSE);
     GetDlgItem(IDC_BUTTON_IN)->EnableWindowTRUE
     GetDlgItem(IDC_EDIT-SEND)->EnableWindow(FALSE);
     UpdateData(FALSE);
  }
  else{
     GetDlgItem(IDC_BUTTON_IN)->EnableWindow(FALSE);
   GetDlgItem(IDC_BUTTON_OUT)->EnableWindow(TRUE);
   GetDlgItem(IDC_EDIT-SEND)->EnableWindow(TRUE);
     int iErrorCode=WSAAsyncSelect(m_hSocket,m_hWnd,WM_SOCKET_READ,   FD_READ);
     if(iErrorCode=SOCKET_ERROR)
      MessageBox(″WSAAsyncSelect failed on socket″,NULL,MB_OK);
    }
  }  手工加入CTalkDialog::OnSockRead(), 响应WinSock 发来的消息
  LRESULT CTalkDialog::OnSockRead(WPARAM wParamLPARAM 1Param)
  {
    int iRead;
    int iBufferLength;
    int iEnd;
    int iSpaceRemain;
    char chIncomingData[100];
    iBufferLength=iSpaceRemain=sizeof (chIncomingData);
   iEnd=0;
   iSpaceRemain-=iEnd;
   iRead=recv(m_hSocket,(LPSTR)(chIncomingData+iEnd),iSpaceRemain,0);
   iEnd+=iRead;
   if (iRead=SOCKET_ERROR)
    AfxMessageBox(″接收数据错误!″);
   chIncomingData[iEnd]=‘/0’;
   if(lstrlen(chIncomingData)!=0)
{
  m_csRecv=m_csRecv+chIncomingData;
  GetDlgItem(IDC_EDIT_RECV)->SetWindowText((LPCSTR)m_csRecv);
  CEdit*pEdit;
  pEdit=(CEdit*)GetDlgItem(IDC_EDIT_RECV);
  int i=pEdit->GetLineCount();
     pEdit->LineScroll(i,0);
    }
    return(OL);
  }
  手工加入CTalkDialog::OnSend(),将指定缓冲区中的数据发送出去。
  void CTalkDialog::OnSend()
   {
    UpdateData();
    m_csSend.TrimLeft();
    m_csSend.TrimRight();
    if(!m_csSend.IsEmpty())
   {
m_csSend=m_csName+″:″+m_csSend+″/r/n″;
   int nCharSend=send(m_hSocket,m_csSend,m_csSend.GetLength(),0);
   if(nCharSend=SOCKET_ERROR)
    MessageBox(″ 发送数据错误!″,NULL,MB_OK);
   }
   m_csSend=″″;
   UpdateData(FALSE);
   CWnd *pEdit=GetDlgItem(IDC_EDIT_SEND);
   pEdit->SetFocus();
   return;
  }
  通过ClassWizard 增加 virtual function PreTranslateMessage(), 控制当按回车键时调用OnSend(),而不是执行缺省按钮的动作。
  BOOL CTalkDialog::PreTranslateMessage(MSG*pMsg)
  {
if(pMsg-> message==WM_KEYDOWN && pMsg-> wParam=VK_RETURN){
     OnSend();
    }
    return CDialog::PreTranslateMessage(pMsg);
  }

  为了简化设计,用户名在客户端控制,服务端只进行简单的接收信息和“广播”此信息,不进行名字校验,也就是说,可以有同名客户登录到服务端。这个程序设计虽然简单,但是已经具备了聊天室的最基本的功能。服务端程序在SCO OpenServer 5.0.5 下编译通过,客户端程序在VC++6.0 下编译通过,在使用TCP/IP 协议的局域网上运行良好。

  上述实例仅用于说明通过 Socket 编程接口能方便地实现跨系统通讯,而这种跨系统通讯在金融行业中有着越来越广泛的应用,利用它可以实现各种多媒体查询,数据传输,网络通讯等功能。因此对跨系统通讯的探讨是非常必要和有意义的,希望上述探讨对大家能有所启发。

 
步进电机励磁模式 1. 励磁模式 步进电机的基本操作模式称为 励磁模式,能够使步进电机工作在全步模式,半步模式和微步模式,其中微步模式能够有效的降低步进电机相电流的噪声,能够改善步进电机固有的噪声震动问题。下面将介绍 3 种励磁模式。 2. 全步励磁模式 所谓全步模式,就是依据电机固有结构设计固定的步距角工作,一个电脉冲,步进电机前进一个步距角。这个步距角使电机设计结构所决定的,也可以理解为电机以最大的步距角旋转。 3. 半步励磁模式 半步模式是以电机固有的结构决定的步距角的一半角度进行步进旋转。如下图所示,步进 阅读详情

相关推荐

Win11家庭版如何让Win+R运行CMD默认管理员权限?3种方法实测有效

本文针对Win11家庭版用户,实测了三种让Win+R运行CMD默认获取管理员权限的有效方法。通过分析UAC机制与家庭版功能限制,详细介绍了注册表编辑、快捷方式创建与任务计划程序三种方案的原理、步骤与风险对比,帮助用户根据安全与效率需求选择最佳方案,实现一键高效管理。

sat99的博客 1270

windows10报错 ‘module‘ object has no attribute ‘AF_UNIX‘

这是我的python代码: if __name__ == '__main__': import socket sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.connect(('0.0.0.0', 4000)) import time time.sleep(2) #sock.send('1') print sock.recv(1024) so

qq_15821487的博客 1104

EMGPro 肌肉电手势识别手环传感器

EMG手势识别技术需要进行多方面的工作,包括传感器的设计和布局、EMG信号的采集和预处理、特征提取和分类等。通过对采集到的信号进行特征提取和分类,可以将手势信号与预定义的手势模型进行匹配,从而实现手势识别和控制。通过使用EMG手势识别技术,用户可以更加自由地操纵设备,使得我们的交互方式更加智能和自然。EMG手势识别是利用EMG信号测量肌肉运动的实时性和高精度性,采用机器学习等技术进行数据处理和分析,并将其应用于手势识别领域的一种技术。

m0_68593468的博客 1386

linux中可以使用-af含义,关于Windows中的linux:AF_UNIX

我有一个希望在Windows上使用的应用程序。 我正在Windows下使用AF_UNIX系列。 我希望知道AF_UNIX系列在Windows中可用。 如果不是,那么AF_UNIX可以替代吗?谢谢Arpit我不是100%知道AF_UNIX的用途是什么,但是如果将其用于进程间通信,则Windows可以使用绑定到本地主机的AF_INET套接字来执行高效的进程间通信。 在这种情况下,Windows确实会检...

weixin_32666933的博客 645

中孚保密检查系统彻底卸载指南:绕过口令与清除内核残留

中孚保密检查系统是深度集成于Windows内核的合规管控软件,其卸载涉及用户态口令校验、内核态服务引擎与Ring 0级驱动自保三重机制。理解其基于SHA-256哈希的本地口令验证原理和zfsysflt.sys过滤驱动的加载逻辑,是实现无残留清理的技术前提。该系统具备高权限驻留特性,常规卸载工具无法触达驱动与服务层,易引发蓝屏、启动缓慢及新安全软件冲突等工程问题。典型应用场景包括涉密终端批量清退、安全研究环境重建及误装后紧急退出。本文聚焦‘口令绕过+手动清理’双轨方案,覆盖注册表、服务、驱动、文件与计划任务五

weixin_33508411的博客 1004

LSTM 怎么进行二维数据的输入呢

尽管LSTM并不天然地适用于处理图像、视频等二维数据,但通过时间序列化、卷积特征提取和双向LSTM等方法,我们可以将二维数据转化为适合LSTM输入的形式,从而利用LSTM的强大记忆能力和长期依赖学习能力对二维数据进行建模。未来的研究方向可以考虑将LSTM与其他模型结合,例如将LSTM与卷积神经网络(Convolutional Neural Network, CNN)结合,利用CNN提取图像的空间特征,然后利用LSTM学习时间序列的长期依赖;

xiamu_CDA的博客 1037

windows及linux下,socket创建

#include <stdio.h> #include <string.h> #ifdef _WIN32 #include <WinSock2.h> #pragma commnet(lib, "ws2_32.lib"); #else #include <sys/socket.h> #include <sys/inet.h> #include <errno.h> #include <sys/time.h> #inc.

时间流浪者 1086

Oracle迁移至华为GaussDB SQL语法和存储过程转换

在将Oracle数据库迁移至GaussDB时,SQL语法和存储过程的转换是确保应用程序正常运行和数据完整性的关键环节。由于两者在数据类型、函数、过程语言等方面存在差异,必须系统化地进行转换和测试。正则表达式脚本:批量替换常见的语法差异。SQL解析工具:解析SQL脚本,生成GaussDB兼容的语法。代码审查工具:自动检查转换后的代码,确保语法和逻辑正确。将Oracle迁移至GaussDB涉及到SQL语法和存储过程的全面转换。通过系统化的转换步骤、使用合适的工具并结合手动调整,可以确保迁移过程的顺利进行。

weixin_38428874的博客 2397

突破FD_SETSIZE限制的连接数之boost库的asio的中fd_set的适配器的设计

前言 这个也我在公司的使用自己写库clib中在win上连接服务器时中只能连接63个的客户端,这个我一开始还以为是自己的配置文件中配置问题呢 就没有注意这个问题。 直到最近自己服务器上业务写完了, 需要压力测试时, 这个问题我可查有几天, 一开始我以为是自己编码中写死了呢, 为什么这样说呢! 在我的知识体系中select最大连接数是1024, 我找很长时间 最后在发现在win 上 FD_SETS...

永远积极向上、永远热泪盈眶、永远豪情满怀、永远坦坦荡荡 1107

微信小程序返回按钮的隐藏玩法:用onShow实现数据自动刷新(附完整代码)

本文深入探讨了微信小程序中用户点击返回按钮后,如何利用onShow生命周期函数实现页面数据的自动刷新。文章对比了onLoad与onShow的差异,提供了从基础的本地存储标记到进阶的EventChannel事件通信,再到状态管理库的多种解决方案,并附有完整的代码示例,帮助开发者构建流畅的用户体验。

agile9scrum的博客 925

AMP架构下的核间通信:RPMSG与共享内存原理详解

本文以RK3568等异构多核硬件为例,深入浅出解析了AMP架构下核间通信的核心逻辑,阐明RPMSG并非替代共享内存,而是以共享内存为数据载体、硬件信箱为中断通知工具、VirtIO为数据管理规则,构建的标准化高层协议与框架,为开发者提供简洁API,实现不同操作系统核心间高效通信。

qq_61335271的博客 2049

Windows Socket API 使用经验

Windows Socket API 使用经验 本文是我在进行MS-Windows、HP-unix网络编程的实践过程中总结出来的一些经验,仅供大家参考。本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。 一、WSAStartup函数 int WSAStartup( WORD wVersionRequested, LPWSADATA lpW...

毛毛帅 241

2026快手爬虫终极指南:JA4+指纹绕过+sign全逆向+AES响应解密(附可运行代码)

快手2026反爬破解实战指南 本文深入剖析快手2026年最新反爬体系,提供完整的破解方案: 四层防御体系:从传输层(JA4+指纹)、应用层(sign参数)、设备层到行为层,90%的爬虫在前两层即被拦截 JA4+指纹绕过:使用curl_cffi模拟Chrome 124的TLS指纹,完美匹配真实浏览器特征 sign参数逆向:通过动态调试提取加密逻辑,Python实现MD5签名算法,包含参数排序和盐值处理 响应解密:破解AES-GCM加密接口数据,完整还原响应内容 技术亮点: 使用curl-impersonate

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1802

Unix和Windows跨系统通讯编程2

四、 跨系统通讯编程实例  下面通过一个实例来具体说明 Socket 在Unix 和Windows 跨系统通讯编程中的应用。  Internet 上可以提供一种叫 IRC(Internet Relay Chatting,Internet 在线聊天系统)的服务。使用者通过客户端的程序登录到 IRC 服务器上,就可以与登录在同一 IRC 服务器上的客户进行交谈,这也就是平常所说的聊天室。在这里,给出了

juvencoco的专栏 1286

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

windows网络通讯端口

windows安全设置 一、windows网络通讯端口 1、端口分类    windows网络通讯端口可分为3大类: 1)公认端口(Well Known Ports):从0到1023,它们紧密绑定于一些服务。通常 这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。 2)注册端口(Registered Ports):从1024到49151。它们松散地绑定于一

kakusyunnrai的专栏 2111

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

unix到底有啥用_什么是 Unix 以及它为什么这么重要?

大多数操作系统可以被划分到两个不同的家族。除了微软的基于Windows NT的操作系统外,几乎所有其他的都可以追溯到Unix。 Linux,Mac OS X,Android,iOS,Chrome OS,PlayStaion 4上运行的Orbis OS,运行在路由器上的各种固件,所有这些操作系统通常都被称为“类Unix”操作系统。Unix的设计现在都还在应用Unix在20世纪60年代中晚期诞生于AT...

weixin_39837727的博客 1486

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

成立一个开源项目——ITC(线程间通讯)Prj

                   最近一段时间,狂看《UNIX编程艺术》,有感于unix编程的简洁,于是狂买了UNIX编程的几本大书《UNIX网络编程》,《UNIX系统编程》联合《windoows核心编程》一起看,于是想象,如何windows的线程间通过也能像unix进程那样,该多少,于是ITC项目就开始诞生了!!初步的想法是:      1)线程间(包括不同进程间的线程),能够互相发

小榕^_^(Littleroy)的专栏 2314

unix到底有啥用_究竟什么是Unix以及它为什么这么重要?

大多数操作系统可以被划分到两个不同的家族。除了微软的基于WindowsNT的操作系统外,几乎所有其他的都可以追溯到Unix。Linux,MacOSX,Android,iOS,ChromeOS,PlayStaion4上运行的OrbisOS,运行在路由器上的各种固件,所有这些操作系统通常都被称为“类Unix”操作系统。Unix的设计现在都还在应用Unix在20世纪60年代中晚期诞生于AT...

weixin_39965161的博客 1211

UNIX家族?一文讲清操作系统繁杂的家族史

简单讲讲操作系统的那些事,让不是做操作系统开发的同学也能大概认识操作系统这个出现在生活各处的东西

无聊人的有趣博客 2099

Windows下 POSIX 线程编程

1. POSIX 标准        POSIX是Portable Operating System Interface of Unix的缩写。由IEEE(Institute of Electrical and Electronic Engineering)开发,由ANSI和ISO标准化。        POSIX的诞生和Unix的发展是密不可分的,Unix于70年代诞生于Bell lab,并

Kevin的专栏 7257

Unix与Windows编程对比一览

转自:http://hi.baidu.com/%CC%EC%C9%BD/blog/item/9a25d6cafc5d2441f31fe710.html 转自:http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/index.html 转自:http://www.tzlink.com/info/show.php?aid=872

一个人,在路上 724

对 DB2 UDB V8 for UNIX、Linux 和 Windows 的生动简介

内容:简介案例研究结束语关于作者对本文的评价订阅:developerWorks 时事通讯Raul F. ChongIBM 多伦多实验室2003 年 1 月 您习惯于通过图像进行直观学习吗?这篇有关 DB2 的图解简介将会使您在学习 DB2 环境的主要概念方面节省一些时间。简介如果对于 IBM® DB2® Universal Database™(UDB)for Linux、UNIX® 和 Windo

1106
上一篇: linux下多线程中条件变量的用法
下一篇: 详解yum的配置文件
suppercom
博客等级 码龄22年 4粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值