精华内容
下载资源
问答
  • 而只是让每个元素知道它下一个元素的位置在哪里。 3.6.1顺序存储结构不足的解决 办法 55 3.6.2线性表链式存储结构定义 56 3.6.3头指针与头结点的异同 58 3.6.4线性表链式存储结构代码描述 58 3.7单链表的读取 60 3.8...
  • 当客户端发送一个请求在网络的某个地方停滞的时候,服务器端并不会感知,延迟一定时间就会发生超时现象,客户端通常会断开连接。而这时候停滞在途中的某个请求,又发送服务器了࿰...
  • 简介 因为当前项目需要在一个linux系统进行串口传感器的收发工作,该串口传感器的收发使用的是字节流专有协议,按照每一个字节的十六进制编码来...而为了保持我们的十六进制数据保持原样的发送过来,必须linux

    简介

    因为当前项目需要在一个linux系统下进行串口传感器的收发工作,该串口传感器的收发使用的是字节流专有协议,按照每一个字节的十六进制编码来确定协议数据。按照以往的思路,串口就是最简单的外设的思想,本想着就是一个小case,但没想到在windows下测试的好好的传感器数据到linux系统上就完全变了样子。。
    变化的数据

    原因分析

    经过一番查资料分析,原来linux的串口因为还有作为终端的功能,所以linux下的串口的设置会比windows要丰富不少。而为了保持我们的十六进制数据保持原样的发送过来,必须将linux下的串口设置为原始输入模式,保留串口数据中的所有控制字,避免linux系统对控制字等数据进行转义。
    在linux中,控制串口的转义方法等各类控制结构在初始化串口时的结构体options中。在设置校验位,数据长度,停止位的时候,也是这个结构体在起作用,其结构如下:

    struct termios {
    
    tcflag_t  c_cflag/* 控制标志*/
    
    tcflag_t  c_iflag;/* 输入标志*/
    
    tcflag_t  c_oflag;/* 输出标志*/
    
    tcflag_t  c_lflag;/* 本地标志*/
    
    tcflag_t  c_cc[NCCS];/* 控制字符*/
    
    };
    

    想做到对这些结构体做到更深入的了解,可以参考另一篇文章:串口属性设置
    而为了保持原始输入模式,我们需要控制的是输入标志和本地标志,将控制标志设置为屏蔽各种控制字,然后输入标志设置为屏蔽各种转义,最后控制字段如下:

    	options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input LOCAL*/
    	options.c_oflag  &= ~OPOST;   /*Output*/
    	options.c_iflag &= ~(IXON | IXOFF | IXANY |BRKINT | ICRNL | ISTRIP );
    

    在如此设置完成后,串口终于能够像pc一样正常的输出数据了!
    附:完整的串口控制文件uart.c

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
    #include <stdio.h>
    #include<unistd.h>
    #include <string.h>
    #define UART_DEVICE     "/dev/ttyUSB0"
     
    #define FALSE  -1
    #define TRUE   0
    
    
    #define REC_LEN 10
    int dec; //设定为串口的设备描述符
    FILE* fd;//串口设备的文件描述符
    
    /**
    *@brief  设置串口通信速率
    *@param  fd     类型 int  打开串口的文件句柄
    *@param  speed  类型 int  串口速度
    *@return  void
    */
    int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
              		   B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
    int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200,  300, 
    		  		  115200, 38400, 19200, 9600, 4800, 2400, 1200,  300, };
    void set_speed(int fd, int speed){
      int   i; 
      int   status; 
      struct termios   Opt;
      tcgetattr(fd, &Opt); 
      for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) { 
        if  (speed == name_arr[i]) {     
          tcflush(fd, TCIOFLUSH);     
          cfsetispeed(&Opt, speed_arr[i]);  
          cfsetospeed(&Opt, speed_arr[i]);   
          status = tcsetattr(fd, TCSANOW, &Opt);  
          if  (status != 0) {        
            perror("tcsetattr fd1");  
            return;     
          }    
          tcflush(fd,TCIOFLUSH);   
        }  
      }
    }
    
    /**
    *@brief   设置串口数据位,停止位和效验位
    *@param  fd     类型  int  打开的串口文件句柄
    *@param  databits 类型  int 数据位   取值 为 7 或者8
    *@param  stopbits 类型  int 停止位   取值为 1 或者2
    *@param  parity  类型  int  效验类型 取值为N,E,O,,S
    */
    int set_Parity(int fd,int databits,int stopbits,int parity)
    { 
    	struct termios options; 
    	if  ( tcgetattr( fd,&options)  !=  0) { 
    		perror("SetupSerial 1");     
    		return(FALSE);  
    	}
    	options.c_cflag &= ~CSIZE; 
    	switch (databits) /*设置数据位数*/
    	{   
    	case 7:		
    		options.c_cflag |= CS7; 
    		break;
    	case 8:     
    		options.c_cflag |= CS8;
    		break;   
    	default:    
    		fprintf(stderr,"Unsupported data size\n"); return (FALSE);  
    	}
    	switch (parity) 
    	{   
    		case 'n':
    		case 'N':    
    			options.c_cflag &= ~PARENB;   /* Clear parity enable */
    			options.c_iflag &= ~INPCK;     /* Enable parity checking */ 
    			break;  
    		case 'o':   
    		case 'O':     
    			options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/  
    			options.c_iflag |= INPCK;             /* Disnable parity checking */ 
    			break;  
    		case 'e':  
    		case 'E':   
    			options.c_cflag |= PARENB;     /* Enable parity */    
    			options.c_cflag &= ~PARODD;   /* 转换为偶效验*/     
    			options.c_iflag |= INPCK;       /* Disnable parity checking */
    			break;
    		case 'S': 
    		case 's':  /*as no parity*/   
    			options.c_cflag &= ~PARENB;
    			options.c_cflag &= ~CSTOPB;break;  
    		default:   
    			fprintf(stderr,"Unsupported parity\n");    
    			return (FALSE);  
    		}  
    	/* 设置停止位*/  
    	switch (stopbits)
    	{   
    		case 1:    
    			options.c_cflag &= ~CSTOPB;  
    			break;  
    		case 2:    
    			options.c_cflag |= CSTOPB;  
    		   break;
    		default:    
    			 fprintf(stderr,"Unsupported stop bits\n");  
    			 return (FALSE); 
    	} 
    	/* Set input parity option */ 
    	if (parity != 'n')   
    		options.c_iflag |= INPCK; 
    	tcflush(fd,TCIFLUSH);
    	options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/   
    	options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
    	options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input LOCAL*/
    	options.c_oflag  &= ~OPOST;   /*Output*/
    	options.c_iflag &= ~(IXON | IXOFF | IXANY |BRKINT | ICRNL | ISTRIP );
    	if (tcsetattr(fd,TCSANOW,&options) != 0)   
    	{ 
    		perror("SetupSerial 3");   
    		return (FALSE);  
    	} 
    	return (TRUE);  
    }
    
    void print_hex(char* chr,int num)
    {
    	for(int i =0;i<num;i++)
    	{
    		printf("0x%02x ",*chr);
    		chr++;
    	}
    	printf("\n");
    }
    int uart_init(void)
    {
        printf("Try Open UART...\n");
        dec = open(UART_DEVICE, O_RDWR | O_NONBLOCK);
        if (dec < 0) {
            perror(UART_DEVICE);
            return -1;
        }
        printf("setting param...%d\n",B9600);
        set_speed(dec,9600);
    	if (set_Parity(dec,8,1,'N') == FALSE)  {
    		printf("Set Parity Error\n");
    		return -2;
    	}
        tcflush(dec, TCIOFLUSH);
    	fd=fdopen(dec,"r+");
    	if (fd < 0) {
            perror(UART_DEVICE);
            return -1;
        }
    	return 0;
    }
    int uart_deinit(void)
    {
    	printf("Close uart..\n");
    	close(dec);
    	return 0;
    }
    ///获取一次串口传感器数据,如果无数据返回-1 得到数据会返回0并传入数据
    int uart_recdata(unsigned char* buf)
    {
    	int has_read=0;
    	int res=0;
    	int offset=0;//第一个有效数据帧头
    	unsigned char rec_buf[REC_LEN*3]={0};//三倍是为了防止溢出
        tcflush(dec, TCIOFLUSH);//预清理一下缓存试试
    	printf("%d",sizeof(rec_buf));
    	while(1) {
    		//res = fread(rec_buf+has_read,1,11-has_read,fd);
    		res = read(dec,rec_buf+offset+has_read,REC_LEN-has_read);
    		if(res<=0 && has_read==0)
    		{
    			return -1;
    		}
    		else if(res<=0)
    		{
    			continue;
    		}else 
    		{
    			printf("waiting for data, has read %d\n",res);
    			print_hex(rec_buf,11);
    			if(has_read+res>=REC_LEN)//说明数据读取完成或溢出
    			{
    				memcpy(buf,rec_buf+offset,REC_LEN);
    				printf("read success\n");
    				return 0;
    			}else{//读到了部分数据,等待继续拼接
    				//拼接时判断数据头是否正确 不正确的话则丢掉部分数据
    				has_read+=res;
    				if(offset==0)
    				{	
    					while(rec_buf[offset]!=0x23 && offset<=sizeof(rec_buf))//数据头是0x23
    					{
    						offset++;
    					}
    					if(offset!=0)
    					{
    						has_read-=offset;
    						printf("edit offset to %d\n",offset);
    					}
    				}
    			}
    		}
    	}
    }
    

    main.c文件

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
    #include <stdio.h>
    #include<unistd.h>
    #include <string.h>
    int main(int argc, char *argv[])
    {
        int res;
        unsigned char buf[15];
        if(!uart_init())printf("init success\n");
        while(1) {
            res = uart_recdata(buf);
            if(!res)
            {
                for(int i=0;i<15;i++)
                {
                    printf("%02X ",buf[i]);
                }
                printf("\n");
                break;//Debug
            }
        }
     
        uart_deinit();
        return 0;
    }
    
    展开全文
  • 大话数据结构

    2019-01-10 16:35:22
    而只是让每个元素知道它下一个元素的位置在哪里。 3.6.1顺序存储结构不足的解决 办法 55 3.6.2线性表链式存储结构定义 56 3.6.3头指针与头结点的异同 58 3.6.4线性表链式存储结构代码描述 58 3.7单链表的读取 60 3.8...
  • 数据汇交软件

    2019-01-17 11:30:51
    确定已经把本单位的所有测绘成果信息填写完毕后,点击本模块中的“另存为汇交数据文件(上报时用)”按钮,在弹出的另存为对话框中选择要保存的路径,单击确定即可在指定的位置生成一个上报文件,该文件发送给测绘...
  • 大话数据结构 程杰

    2018-09-01 10:06:43
    而只是让每个元素知道它下一个元素的位置在哪里。 3.6.1顺序存储结构不足的解决 办法 55 3.6.2线性表链式存储结构定义 56 3.6.3头指针与头结点的异同 58 3.6.4线性表链式存储结构代码描述 58 3.7单链表的读取 60 3.8...
  • 但是URL重写,并且,将一个带假目录的虚拟地址重写到一个不带假目录的页面时,由于浏览器客户端和服务端此时的当前页面计算方法是不同的,就会发生相对路径的匹配错误问题!真实很严重的问题啊! 解决的办法,只有...
  • 网络游戏和各类社交网络都在成几何倍数的增长,不管网络游戏还是各类互动社交网络,交互性和复杂度都在迅速提高,都需要在极短的时间内将数据同时投递给大量用户,因此传输技术自然变为未来制约发展的一个重要因素,...
  • 可能你已经注意,变量都有一个美元符号($)的前缀。所有变量都是局部变量,为了使得定义的函数中可以使用外部变量,使用global语句。而你要该变量的作用范围限制在该函数之内,使用static语句。 $g_var = 1 ; /...
  • 大话数据结构-程杰

    2014-07-13 23:45:52
    而只是让每个元素知道它下一个元素的位置在哪里。 3.6.1 顺序存储结构不足的解决 办法 55 3.6.2 线性表链式存储结构定义 56 3.6.3 头指针与头结点的异同 58 3.6.4 线性表链式存储结构代码描述 58 3.7 单链表的...
  • 而只是让每个元素知道它下一个元素的位置在哪里。 3.6.1 顺序存储结构不足的解决 办法 55 3.6.2 线性表链式存储结构定义 56 3.6.3 头指针与头结点的异同 58 3.6.4 线性表链式存储结构代码描述 58 3.7 单链表的读取 ...
  • 而只是让每个元素知道它下一个元素的位置在哪里。 3.6.1顺序存储结构不足的解决 办法 55 3.6.2线性表链式存储结构定义 56 3.6.3头指针与头结点的异同 58 3.6.4线性表链式存储结构代码描述 58 3.7单链表的读取 60 3.8...
  • 同时一个mail note发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-mail账号,查询mail 服务器的会话…… 还包括消息客户端程序,通过连接创建会话。创建发送者和映射消息。发送消息,同时对文本...
  • 同时一个mail note发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-mail账号,查询mail 服务器的会话…… 还包括消息客户端程序,通过连接创建会话。创建发送者和映射消息。发送消息,同时对文本...
  • 我在设计一个状态机,用函数表示每种状态,每个函数都会返回一个指向下一个状态的函数的指针。可我找不任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此...
  • IP多播

    2021-01-12 09:58:33
    使用广播服务,封包可以被发送到网络中的每个节点,而使用本节介绍的多播服务,封包仅被发送到网络节点的一个集合。 IGMP 是IPv4 引入的管理多播客户和它们之间关系的协议。 一、多播地址 为了发送IP 多播数据,...

    使用广播服务,封包可以被发送到网络中的每个节点,而使用本节将介绍的多播服务,封包仅被发送到网络节点的一个集合。
    IGMP 是IPv4 引入的管理多播客户和它们之间关系的协议。

    一、多播地址

    为了发送IP 多播数据,发送者需要确定一个合适的多播地址,这个地址代表一个组。IP多播地址采用D 类IP 地址确定多播的组,地址的范围是224.0.0.0~239.255.255.255。不过,有许多多播地址保留为特殊目的使用,下表列出了一些比较重要的地址(保留的IP 多播地址):
    224.0.0.0    基地址(保留)
    224.0.0.1     本子网上的所有节点
    224.0.0.2     本子网上的所有路由器
    224.0.0.4     网段中所有的 DVMRP 路由器
    224.0.0.5     所有的 OSPF 路由器
    224.0.0.6    所有的 OSPF 指派路由器
    224.0.0.9     所有的 RIPv2 路由器
    224.0.0.13     所有的 PIM 路由器

    二、使用IP多播

    1. 加入和离开组

    加入和离开多播组可以使用setsockopt 函数,也可以使用WSAJoinLeaf 函数。使用setsockopt 函数更方便一点
    有两 个套接字选项控制组的加入和离开: IP_ADD_MEMBERSHIP 和 IP_DROP_MEMBERSHIP,套接字选项级别是 IPPROTO_IP,输入参数是一个 ip_mreq 结构,定义如下:
    typedef struct {
        struct in_addr imr_multiaddr; // 多播组的IP 地址
        struct in_addr imr_interface; // 将要加入或者离开多播组的本地地址
    } ip_mreq;
    下面的代码示例了如何加入组,其中s 是已经创建好的数据报套接字:

    ip_mreq mcast;
    mcast.imr_interface.S_un.S_addr = INADDR_ANY;
    mcast.imr_multiaddr.S_un.S_addr = inet_addr("234.5.6.7");
    int nRet = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mcast, sizeof(mcast));
    加入一个或者多个多播组之后,可以使用IP_DROP_MEMBERSHIP 选项离开特定的组:
    ip_mreq mcast;
    mcast.imr_interface.S_un.S_addr = dwInterFace;
    mcast.imr_multiaddr.S_un.S_addr = dwMultiAddr;
    int nRet = ::setsockopt(s, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char*)&mcast, sizeof(mcast));

    2. 接收多播数据

    主机在接收IP 多播数据之前,必须成为IP 多播组的成员。为了接收发送到特定端口的多播封包,有必要绑定到那个本地端口,而不显式地指定本地地址。如果绑定套接字设置了 SO_REUSEADDR 选项,就有不止一个进程可以绑定到UDP 端口,如下代码所示。
    BOOL bReuse = TRUE;
    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&bReuse, sizeof(BOOL));
    如此一来,每个来到这个共享端口的多播或广播UDP 封包都会被发送给所有绑定到此端口的套接字。由于向前兼容的原因,这并不包括单播封包-单播封包永远不会被发送到多个套接字。
    下面是接收多播封包的程序,它绑定到本地端口 4567 之后,便加入多播组234.5.6.7,循环调用recvfrom 函数接收发送到多播组中的数据:

    void main()
    { 
    	// 创建UDP套接字
    	SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);
    	// 允许其他进程使用绑定的地址(端口复用)
    	BOOL bReuse = TRUE;
    	::setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&bReuse, sizeof(BOOL));
    	// 绑定到4567 端口
    	sockaddr_in si;
    	si.sin_family = AF_INET;
    	si.sin_port = ::ntohs(4567);
    	si.sin_addr.S_un.S_addr = INADDR_ANY;
    	::bind(s, (sockaddr*)&si, sizeof(si));
    	// 加入多播组
    	ip_mreq mcast;
    	mcast.imr_interface.S_un.S_addr = INADDR_ANY;
    	mcast.imr_multiaddr.S_un.S_addr = ::inet_addr("234.5.6.7"); // 多播地址为234.5.6.7
    	::setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mcast, sizeof(mcast));
    	// 接收多播组数据
    	char buf[1280];
    	int nAddrLen = sizeof(si);
    	while(TRUE)
    	{ 
    		int nRet = ::recvfrom(s, buf, strlen(buf), 0, (sockaddr*)&si, &nAddrLen);
    		if(nRet != SOCKET_ERROR)
    		{ 
    			buf[nRet] = '\0';
    			printf(buf);
    		}
    		else
    		{ 
    			int n = ::WSAGetLastError();
    			break;
    		}
    	}
    }
    

    3. 发送多播数据

    要向组发送数据,没有必要非加入那个组。在前面的例子中,以234.5.6.7 为目的地址,4567 为目的端口调用sendto 函数,即可向多播组234.5.6.7 发送数据。默认情况下,发送的IP 多播数据报的TTL 等于1,这使得它们不能被发出子网。套接字选项 IP_MULTICAST_TTL 用来设置多播数据报的TTL 值(范围为0~255),如下代码所示。

    BOOL SetTTL(SOCKET s, int nTTL) // 自定义设置多播数据TTL 的函数
    { 
        int nRet = ::setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&nTTL, sizeof(nTTL));
        return nRet != SOCKET_ERROR;
    }

    为了提供有意义的范围控制,多播路由器支持TTL"极限"的概念,它阻止TTL小于特定值的数据报在特定子网上传输。极限执行如下约定:
    初始TTL为0         多播封包被限制在同一个主机
    初始TTL为1         多播封包被限制在同一个子网
    初始TTL为32     多播封包被限制在同一个站点
    初始TTL为64     多播封包被限制在同一个地区
    初始TTL为128     多播封包被限制在同一个大陆
    初始TTL为255     多播封包没有范围限制
    许多多播路由器拒绝转发目的地址在224.0.0.0~224.0.0.255 之间的任何多播数据报,不管它的TTL 是多少。这个地址范围是为路由协议和其他底层拓扑发现协议或者维护协议预留的,如网关发现和组成员报告等。每个多播传输仅从一个网络接口发出,即便是主机有多个多播接口。系统管理者在安装
    过程中就指定了多播使用的默认接口。可以使用套接字选项 IP_MULTICAST_IF 改变默认的发送数据接口,如下代码所示。
    struct in_addr addr;
    setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr));
    其中,addr 是本地机器上对外的接口。设置为地址 INADDR_ANY 可以恢复使用默认接口。选项 IP_MULTICAST_LOOP 可以设置多播回环是否打开。如果值为真,发送到多播地址的数据会回显到套接字的接收缓冲区。默认情况下,当发送IP 多播数据时,如果发送方也是多播组的一个成员,数据将回到发送套接字。如果设置此选项为FALSE,任何发送的数据都不会被发送回来。

    4.带源地址的IP 多播

    带源地址的IP 多播允许加入组时指定要接收哪些成员的数据。在这种情况下有两种方式加入组。第一种是"包含"方式,在这种方式下,为套接字指定N 个有效的源地址,套接字仅接收来自这些源地址的数据。另外一种是"排除"方式,在这种方式下,为套接字指定N个源地址,套接字将接收来自这些源地址之外的数据,也就是来自其他成员的数据。要使用"包含"方式加入多播组,应使用套接字选项 IP_ADD_SOURCE_MEMBERSHIP 和 IP_DROP_SOURCE_MEMBERSHIP。第一步是添加一个或者多个源地址。这两个套接字选项的输入参数都是一个ip_mreq_source 结构。

    struct ip_mreq_source {
    	struct in_addr imr_multiaddr; // 多播组的IP 地址
    	struct in_addr imr_sourceaddr; // 指定的源IP 地址
    	struct in_addr imr_interface; // 本地IP 地址接口
    };

    mr_sourceaddr 域指定了源IP 地址,套接字将接收来自此IP 地址的数据。如果有多个有效的源地址,IP_ADD_SOURCE_MEMBERSHIP 就应该被调用多次。下面的例子在本地接口上加入了多播组234.5.6.7,同时指定仅接收来自218.12.255.113 和218.12.174.222 的数据:

    SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    // 本地接口
    SOCKADDR_IN localif;
    localif.sin_family = AF_INET;
    localif.sin_port = htons(5150);
    localif.sin_addr.s_addr = htonl(INADDR_ANY);
    ::bind(s, (SOCKADDR *)&localif, sizeof(localif));
    // 设置ip_mreq_source 结构
    struct ip_mreq_source mreqsrc;
    mreqsrc.imr_interface.s_addr = inet_addr("192.168.0.46");
    mreqsrc.imr_multiaddr.s_addr = inet_addr("234.5.6.7");
    // 添加源地址218.12.255.113
    mreqsrc.imr_sourceaddr.s_addr = inet_addr("218.12.255.113");
    ::setsockopt(s, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, (char *)&mreqsrc, sizeof(mreqsrc));
    // 添加源地址218.12.174.222
    mreqsrc.imr_sourceaddr.s_addr = inet_addr("218.12.174.222");
    ::setsockopt(s, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, (char *)&mreqsrc, sizeof(mreqsrc));

    排除方式,为了加入多播组,同时排除一个或者多个源地址,加入组时使用 IP_ADD_MEMBERSHIP 选项。加入组后,便可以使用 IP_BLOCK_SOURCE 选项来指定要排除的源地址了。这里,输入参数也是 ip_mreq_source 结构。如果应用程序想从以前排除的地址接收数据,它可以通过使用IP_UNBLOCK_SOURCE选项从排除集合中移除此源地址,输入参数仍是ip_mreq_source 结构。

    展开全文
  • 入门学习Linux常用必会60命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    所以这个选项当然没有时间参数,但是可以输入一个用来解释的讯息,而这信息会送每位使用者。 -F:在重启计算机时强迫fsck。 -time:设定关机前的时间。 -m: 系统改为单用户模式。 -i:关机时显示系统...
  • 解决办法为:运行“Regedit”命令打开注册表编辑器,依次定位“[HKEY_ LOCAL_MACHINESOFTWAREMicrosoftInternet Explorer Security]”,在窗口右边新建一个名为“BlockXBM”的REG_ DWORD值,其值设置为“0”...
  •  在硬盘上添加一个 20 MB 的分区:  diskpart /add Device HardDisk0 20  Fixboot  向系统分区写入新的分区引导扇区。只有在使用故障恢复控制台时,才能使用 fixboot 命令。  fixboot [drive]  ...
  • 《你必须知道的495C语言问题》

    热门讨论 2010-03-20 16:41:18
    我在设计一个状态机,用函数表示每种状态,每个函数都会返回一个指向下一个状态的函数的指针。可我找不任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此...
  • 我在设计一个状态机,用函数表示每种状态,每个函数都会返回一个指向下一个状态的函数的指针。可我找不任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此...
  • wireless.zip

    2020-06-03 15:07:52
    > 正常情况,消费者在消费完毕时,会发送一个确认消息给消息队列,消息队列就知道消息被消费了,就会该消息从消息队列中 >删除。不同的消息队列发出的确认消息形式不同,rabbitmq发送的是一个ack确认消息,...
  • 自动化测试另外一个重要特点就是快速反馈,反馈越迅速意味着开发效率越高。拿UI组件为例,开发过程都是打开浏览器刷新页面点点点才能确定UI组件工作情况是否符合自己预期。接入自动化测试以后,...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
    同时一个mail note发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-mail账号,查询mail 服务器的会话……  还包括消息客户端程序,通过连接创建会话。创建发送者和映射消息。发送消息,同时对...
  • 同时一个mail note发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-mail账号,查询mail 服务器的会话…… 还包括消息客户端程序,通过连接创建会话。创建发送者和映射消息。发送消息,同时对文本...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    同时一个mail note发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-mail账号,查询mail 服务器的会话……  还包括消息客户端程序,通过连接创建会话。创建发送者和映射消息。发送消息,同时对...
  • 首页请求数据之后,根据热门度返回多数据,将数据存储list集合中,并且将它转换为JSON格式数据,返回页面,页面解析数据并且显示。  商场则负责显示所有的商品数据,实现侧边栏点击指定的类别之后,显示对应...
  • 摘要:为提高单片机通讯的实时性,采用了动态的内存管理...控制站然后轮询下一个站点,周而复始。 为了提高通讯效率,采取了一系列相应的措施.例如,我们把站点集分为活动站点集和非活动站点集.这样,单片机网中如

空空如也

空空如也

1 2 3 4 5 6
收藏数 113
精华内容 45
关键字:

为了确定将数据发送到下一个