精华内容
下载资源
问答
  • 本篇文章是对如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑的技巧进行了详细的分析介绍,需要的朋友参考下
  • 网络通信的标准流程是,服务端新建一个socket,然后在该socket中...看多个客户端或者多个连接是如何在一个监听的socket中完成通信的。服务器收到一个syn包的时候,在tcp_rcv中进行处理。该函数根据tcp数据包中的目...

    网络通信的标准流程是,服务端新建一个socket,然后在该socket中绑定一个地址,再设置该socket为监听socket,然后阻塞在accept等待连接。客户端新建一个socket,然后connect到一个服务端的地址。下面分析一下这个过程。看多个客户端或者多个连接是如何在一个监听的socket中完成通信的。

    服务器收到一个syn包的时候,在tcp_rcv中进行处理。该函数根据tcp数据包中的目的端口和ip,源端口和ip找到一个最匹配的socket

    sk = get_sock(&tcp_prot, th->dest, saddr, th->source, daddr);

    下面是get_socket的代码。

    struct sock *get_sock(struct proto *prot, unsigned short num,
    				unsigned long raddr,
    				unsigned short rnum, unsigned long laddr)
    {
    	struct sock *s;
    	struct sock *result = NULL;
    	int badness = -1;
    	unsigned short hnum;
    
    	hnum = ntohs(num);
    
    	for(s = prot->sock_array[hnum & (SOCK_ARRAY_SIZE - 1)];
    			s != NULL; s = s->next) 
    	{
    		int score = 0;
    
    		if (s->num != hnum) 
    			continue;
    
    		if(s->dead && (s->state == TCP_CLOSE))
    			continue;
    		/* local address matches? */
    		if (s->saddr) {
    			if (s->saddr != laddr)
    				continue;
    			score++;
    		}
    		/* remote address matches? */
    		if (s->daddr) {
    			if (s->daddr != raddr)
    				continue;
    			score++;
    		}
    		/* remote port matches? */
    		if (s->dummy_th.dest) {
    			if (s->dummy_th.dest != rnum)
    				continue;
    			score++;
    		}
    		/* perfect match? */
    		// 全匹配,直接返回
    		if (score == 3)
    			return s;
    		/* no, check if this is the best so far.. */
    		if (score <= badness)
    			continue;
    		// 记录最好的匹配项
    		result = s;
    		badness = score;
      	}
      	return result;
    }

    监听socket中有本机的ip和监听的端口。所以根据tcp数据包,可以找到对应的socket。接着判断找到的socket的状态。

    if(sk->state!=TCP_ESTABLISHED)	{
    	
    		// 是监听socket则可能是一个syn包	
    		if(sk->state==TCP_LISTEN)
    		{	// 不存在收到ack包的可能,发送重置包
    			if(th->ack)	
    				tcp_reset(daddr,saddr,th,sk->prot,opt,dev,sk->ip_tos, sk->ip_ttl);
    
    			// 不存在这种可能的各种情况,直接丢包			   
    			if(th->rst || !th->syn || th->ack || ip_chk_addr(daddr)!=IS_MYADDR)
    			{
    				kfree_skb(skb, FREE_READ);
    				release_sock(sk);
    				return 0;
    			}
    		
    			// 是个syn包,建立连接
    			tcp_conn_request(sk, skb, daddr, saddr, opt, dev, tcp_init_seq());
                    }
    }

    tcp_conn_request函数很长,下面只列出关键代码。sock结构体是tcp层的表示,socket结构体是更上层的抽象,比如unix域套接字,也是使用socket结构体,然后在unix域实现的时候,使用unix_proto_data结构体。socket和sock结构体是互相指向的。tcp维护了一个哈希链表,以监听的端口号为因子进行哈希。

    // 分配一个新的sock结构用于连接连接
    newsk = (struct sock *) kmalloc(sizeof(struct sock), GFP_ATOMIC);
    // 从listen套接字复制内容,再覆盖某些字段
    memcpy(newsk, sk, sizeof(*newsk));
    // 进入第二次握手状态
    newsk->state = TCP_SYN_RECV;
    // 记录ip
    newsk->dummy_th.source = skb->h.th->dest;
    newsk->dummy_th.dest = skb->h.th->source;
    newsk->daddr = saddr;
    newsk->saddr = daddr;
    // 放到tcp的socket哈希队列
    put_sock(newsk->num,newsk);
    // 分配一个skb
    buff = newsk->prot->wmalloc(newsk, MAX_SYN_SIZE, 1, GFP_ATOMIC);
    // 发送ack,即第二次握手
    newsk->prot->queue_xmit(newsk, ndev, buff, 0);
    // skb关联的socket为newsk,accept的时候摘取skb时即拿到该socke对应的socket返回给应用层
    skb->sk = newsk;
    skb_queue_tail(&sk->receive_queue,skb);

    至此完成了tcp的两次握手。

    等收到客户端的ack的时候,在tcp_ack中完成第三次握手。

           if(sk->state==TCP_SYN_RECV){
    		tcp_set_state(sk, TCP_ESTABLISHED);
    	}

    此时的内存视图如下。

    6f942c38875970cf9ecf5bcaa58bb776.png

    第一个sock结构体就是负责监听的,第二个就是建立连接后,新建的,其中新建的sock和监听sock有很多字段是一样的。不过新建的sock里记录了目的端口、ip、源端口、源ip。这时候accept函数就会返回新建的sock,我们就会对这个sock进行读写操作(其实是对上层的sockect结构体进行操作)。当我们阻塞在read的时候,如果收到了一个数据包,处理函数还是tcp_rcv,第一步还是根据tcp包的源ip、端口、目的ip、目的端口到sock池子里查找最匹配的sock结构体,这时候找到的就是刚才我们新建的那个sock。因为他四个都匹配上了。接着在tcp_data函数里把数据包对应的skb结构体放到新建sock的receive_queue。read从阻塞中返回,并拿到数据包的数据。

    通过上面的分析,我们可以知道几点,第一,监听的sock和数据通信的sock结构是一样的,但是他们的receive_queue里的数据包含义不一样,监听sock的receive_queue中的节点代表的是即将或者已经建立连接的节点,而数据通信的sock的receive_queue中的节点是通信的数据。我们知道的第二点是多个客户端或者连接,是如何在一个监听的sock中完成tcp的建立,又是从监听的sock中过渡到数据通信sock,最后在新加的sock中完成数据通信的。

    展开全文
  • 首先,我们来开一下计算机是如何检测边缘的。以灰度图像为例,它的理论基础是这样的,如果出现一个边缘,那么图像的灰度就会有一定的变化,为了方便假设由黑渐变为白代表一个边界,那么对其灰度分析,在边缘的灰度...

    首先,我们来开一下计算机是如何检测边缘的。以灰度图像为例,它的理论基础是这样的,如果出现一个边缘,那么图像的灰度就会有一定的变化,为了方便假设由黑渐变为白代表一个边界,那么对其灰度分析,在边缘的灰度函数就是一个一次函数y=kx,对其求一阶导数就是其斜率k,就是说边缘的一阶导数是一个常数,而由于非边缘的一阶导数为零,这样通过求一阶导数就能初步判断图像的边缘了。通常是X方向和Y方向的导数,也就是梯度。理论上计算机就是通过这种方式来获得图像的边缘。

        但是,具体应用到图像中你会发现这个导数是求不了的,因为没一个准确的函数让你去求导,而且计算机在求解析解要比求数值解麻烦得多,所以就想到了一种替代的方式来求导数。就是用一个3×3的窗口来对图像进行近似求导。拿对X方向求导为例,某一点的导数为第三列的元素之和减去第一列元素之和,这样就求得了某一点的近似导数。其实也很好理解为什么它就近似代表导数,导数就代表一个变化率,从第一列变为第三列,灰度值相减,当然就是一个变化率了。这就是所谓的Prewitt算子。这样近似X方向导数就求出来了。Y方向导数与X方向导数求法相似,只不过是用第三行元素之和减去第一行元素之和。X方向和Y方向导数有了,那么梯度也就出来了。这样就可以找出一幅图中的边缘了。

    还有一个问题,由于求的是3×3中心点的导数,所以给第二列加了一个权重,它的权重为2,第一列和第三列的权重为1,好了,这就是Sobel算子了。相比Prewitt算子,Sobel的抗噪能力更强。如图所示:

    这样,中心点的Y方向导数就求出来了。

    举个例子吧。X点以Sobel方式求导数ΔX=1×50+2×30+1×50-(1×50+2×30+1×50)=0。这样可以看出这个点不是边界。

    好了,了解了基本理论之后,我们看看OpenCv下的Sobel函数吧,void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );src:输入图像;dst:输出图像;xorder:x 方向上的差分阶数;yorder:y 方向上的差分阶数;aperture_size 扩展 Sobel 核的大小(既窗口阶数),必须是 1(注意这是一个3×1或1×3向量而不是一个方阵), 3, 5 或 7。

    其实,这里是问题的,因为以Sobel方式求完导数后会有负值,还有会大于255的值而你建的Sobel的图像是 IPL_DEPTH_8U,也就是8位无符号数,所以Sobel建立的图像位数不够,要16位有符号的,也就是 IPL_DEPTH_16S。把建立图像这句改为

    sobel=cvCreateImage(cvGetSize(frame),IPL_DEPTH_16S,1);运行,发现不报错了,但是Sobel图像显示不出来,这是什么原因呢?原来图像显示是以8位无符号显示的,现在是16位有符号,当然显示会出问题了。所以还要将Sobel转为8位无符号。OpenCv里提供了一个函数,就是cvConvertScaleAbs( const CvArr* src, CvArr* dst, double scale=1, double shift=0 );src:源图像;dst:目标图像;scale:转化前乘的系数;shift转化前加的系数。这样新建一个无符号图像再转换就可以实现了。

    IplImage *sobel8u=cvCreateImage(cvGetSize(sobel),IPL_DEPTH_8U,1);

    再在显示图像前加上cvConvertScaleAbs(sobel,sobel8u,1,0);这样就可以看到cvSobel的效果了。可以看X方向或Y方向求导是什么效果。

    代码如下

     1 //Sobel边缘检测的程序
     2 #include "cv.h"
     3 #include "highgui.h"
     4 int main( int argc , char** argv)
     5 {
     6   //以灰度图格式加载图像或者用函数cvCvtColor(frame,gray,CV_BGR2GRAY);转为灰度
     7   IplImage* src = cvLoadImage(argv[1],CV_LOAD_IMAGE_GRAYSCALE);
     8   //以sobel方式求完导之后会有负数,会有大于255的值,故建立图像的数据格式
     9   //要为IPL_DEPTH_16S
    10   IplImage* dst1 = cvCreateImage(cvGetSize(src),IPL_DEPTH_16S,1);
    11   IplImage* dst2 = cvCreateImage(cvGetSize(src),IPL_DEPTH_16S,1);
    12   IplImage* dst18u = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
    13   IplImage* dst28u = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
    14   //逼近x方向上一阶微分的Sobel算子的效果
    15   cvSobel(
    16           src,
    17           dst1,
    18           1,
    19           0,
    20           3);
    21   //逼近y方向上一阶微分的Sobel算子的效果  
    22   cvSobel(
    23           src,
    24           dst2,
    25           0,
    26           1,
    27           3);
    28   //图像是以8位无符号显示的,故要把输出图像的数据格式转化为IPL_DEPTH_8U
    29   cvConvertScaleAbs(dst1,dst18u,1,0);
    30   cvConvertScaleAbs(dst2,dst28u,1,0);
    31   cvNamedWindow("src",1);
    32   cvNamedWindow("dst1",1);
    33   cvNamedWindow("dst2",1);
    34   cvShowImage("src",src);
    35   cvShowImage("dst1",dst18u);
    36   cvShowImage("dst2",dst28u);
    37   cvWaitKey(0);
    38   cvReleaseImage(&src);
    39   cvReleaseImage(&dst1);
    40   cvReleaseImage(&dst2);
    41   cvReleaseImage(&dst18u);
    42   cvReleaseImage(&dst28u);
    43   cvDestroyWindow("src");
    44   cvDestroyWindow("dst1");
    45   cvDestroyWindow("dst2");
    46   return 0;
    47 }

     

    转载于:https://www.cnblogs.com/feifanrensheng/p/8047420.html

    展开全文
  • 根据身份证号码判断男女性别需要用到的函数知识:一、逻辑判断函数:IF()函数二、取余函数:MOD()函数三、截取字符串函数:MID()函数案例讲解:已知某公司员工的身份证号码,根据身份证号码判断男女性别...

    众所周知,我们的身份证号码里面包含的信息有很多,如出生日期、性别和识别码等,如果现在给你一张表,让你根据已知的身份证号码去判断男女性别并在工作表中显示,你知道怎么做吗?如果不会,就一起来学习一下吧!

    265643cd892bf9003f99202506578e65.png

    根据身份证号码判断男女性别需要用到的函数知识:

    一、逻辑判断函数:IF()函数

    二、取余函数:MOD()函数

    三、截取字符串函数:MID()函数

    案例讲解:已知某公司员工的身份证号码,根据身份证号码判断男女性别:身份证号码倒数第二位为判断男女性别的依据,偶数为女,奇数为男

    步骤解析:

    1.先将身份证号码的倒数第二位数字提取出来

    函数参数:MID(在什么地方提取,从第几位开始提取,提取的字符数长度)

    2.对提取出来的数字进行取余计算,取余结果有两种,分别为0、1,为0数字为偶数,为1数字为奇数

    函数参数:MOD(被除数,除数);除数一般固定为2

    3.对取余结果进行判断,偶数为女,奇数为男

    函数参数:IF(判断条件,满足条件返回的值,不满足条件返回的值)

    小贴士:

    满足条件返回的值即是在判断条件成立的情况下单元格显示的内容

    不满足条件返回的值即是在判断条件不成立的情况下单元格显示的内容

    IF函数简单语法:如果……就……否则

    IF函数第一个参数为判断条件,判断条件需要包含的内容有:判断对象(对什么进行判断)、判断标准(需要满足的具体条件,需要有比较运算符中的任意一个存在)

    cc504348ce0b0a0824b0fdaab38ed0c2.gif

    看完之后希望对你有所帮助!

    展开全文
  • MySQL如何使用时间作为判断条件?本篇文章小编给大家分享一下MySQL使用时间作为判断条件代码解析,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。背景:在开发过程中,我们经常需要根据...

    MySQL如何使用时间作为判断条件?本篇文章小编给大家分享一下MySQL使用时间作为判断条件代码解析,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。

    背景:在开发过程中,我们经常需要根据时间作为判断条件来查询数据,例如:当月,当日,当前小时,几天内......

    1. 当月

    我们只需要使用一个mysql的MONTH(date)函数即可实现。(注意判断年份)

    MONTH(date);

    -- 用法:MONTH函数返回一个整数,表示指定日期值的月份。

    -- 举例

    SELECT MONTH('2020-11-11 00:00:00')

    -- 返回值是11

    2. 30天内

    之所以把“30天内”放在当月的后面,是因为我经常会遇到这两个需求相互转换的情况,“30天内”也可以称作“一个月内”。

    这种情况我们需要使用DATEDIFF(expr1,expr2)函数。

    DATEDIFF(expr1,expr2)

    -- 用法:参数为两个日期,返回的是expr1-expr2的天数差

    -- 举例

    SELECT DATEDIFF('2020-11-01 08:00:00','2020-11-11 00:00:00')

    -- 返回值是-10

    3. 当日

    当日需要使用TO_DAYS(date)函数。

    TO_DAYS(date)

    -- 用法:返回从0000年(公元1年)至当前日期的总天数。

    -- 举例

    SELECT TO_DAYS('0000-01-01')

    -- 返回值是1

    SELECT TO_DAYS('0001-01-01')

    -- 返回值是366

    4. 当前小时

    这种情况需要HOUR(date)和CURDATE()函数配合使用。

    HOUR(date)

    -- 用法:返回当前时间是今日的第几个小时

    -- 举例

    SELECT HOUR('2020-11-11 11:11:11')

    -- 返回值是11

    CURDATE()

    -- 用法:返回今日的日期,不包括时分秒, yyyy-MM-dd

    -- 使用举例

    select * from table where created_at > CURDATE() and HOUR(created_at) = HOUR(now())

    5. x天内

    可以使用DATE_SUB(date,INTERVAL expr unit)函数来实现。

    DATE_SUB(date,INTERVAL expr unit)

    -- 用法:起始日期date 减去一个时间段后的日期

    后面的单位unit有很多值可以选择,如下表:

    fca729d4e06a17caaaa77f77012cb411.png

    -- 举例

    -- 七天内的数据查询

    select * from table where created_at > DATE_SUB(CURDATE(),INTERVAL 7 DAY)

    6. 多少天内数据统计

    我们经常还会遇到这种需求,统计7天内每天数据的量。这种情况下,我们需要考虑没有数据推送的情况,即为0也要得到。

    思路如下:

    SELECT

    DATE_SUB( CURDATE(), INTERVAL m.s day ) AS orderDate

    FROM

    (

    SELECT 0 as s UNION ALL

    SELECT 1 UNION ALL

    SELECT 2 UNION ALL

    SELECT 3 UNION ALL

    SELECT 4 UNION ALL

    SELECT 5 UNION ALL

    SELECT 6

    ) m

    以上面的sql查询结果作为临时表,匹配数据表统计多少天内的数据数量

    -- 举例:查询12个月内每个月数据的数量

    SELECT COUNT(t.created_at),res.date FROM

    (SELECT

    DATE_FORMAT(DATE_SUB( CURDATE(), INTERVAL m.s MONTH ),'%Y-%m') AS date

    FROM

    (

    SELECT 0 as s UNION ALL

    SELECT 1 UNION ALL

    SELECT 2 UNION ALL

    SELECT 3 UNION ALL

    SELECT 4 UNION ALL

    SELECT 5 UNION ALL

    SELECT 6 UNION ALL

    SELECT 7 UNION ALL

    SELECT 8 UNION ALL

    SELECT 9 UNION ALL

    SELECT 10 UNION ALL

    SELECT 11

    ) m)res

    left join

    table t on res.date = DATE_FORMAT(t.created_at,'%Y-%m')

    GROUP BY date

    展开全文
  • 这里主要想说的是服务端与客户端是如何利用session进行交互的。工作流程先看下面这幅流程图:当用户第一次访问站点时,PHP会用session_start()函数为用户创建一个session ID,这就是针对这个用户的唯一标识,每一个...
  • 这行记录,我以tab键解析 那么结果 应当是 电脑公 3楼 fff 那个"司"字丢掉就算了,但是这条记录不能丢,请问用java怎么达到这个目标 Oracle中有个ASCIISTR可以来判断乱码,Java有类似的吗? 附加 ...
  • 虽然标题写的是如何判断两个对象相等,但本篇我们不仅仅判断两个对象相等,实际上,我们要做到的是如何判断两个参数相等,而这必然会涉及到多种类型的判断。文章是我从网上找到解答最详细的博客,是对Underscore的eq...
  • 如何判断一个函数是否会抛出异常,以及抛出哪些异常? C++提供语法用于声明函数所抛出的异常 异常声明作为函数声明的修饰符,写在参数列表后面 异常规格说明的意义: 提示函数调用者必须做好异常处理的准备 提示...
  • 严格解析:有除了数字或者字母外的符号(空格,分号,etc.)都会Falseisalnum()必须是数字和字母的混合isalpha()不区分大小写002pc.com认为此文章对《python爬取的源码复制python如何判断输入都是字母》说的很在理。...
  • python 如何判断字符串中数字和字母

    千次阅读 2019-09-16 17:57:55
    isdigit()严格解析:有除了数字或者字母外的符号(如空格,分号,etc.)都会False isalnum()必须是数字和字母的混合 ...#用isdigit()函数判断是否数字,比较常用 print(str_1.isdigit()) True print(st...
  • 静态库的制作步骤:  (1)gcc -c mylib.c -o mylib.o  (2)ar rc libmylib.a mylib... 如何判断某个可执行二进制文件含有什么动态解析函数库?用ldd就可以知道。 例如:想要知道/usr/bin/passwd这个程序含有...
  • 元素拖拽分成3个步骤:按下鼠标,移动鼠标,松开鼠标。 拖拽原理:按下拖拽元素后开始监听文档中鼠标移动事件,然后再监听鼠标松开事件;...进入mouseHandler函数后,进行if else if 的判断,如果是按下
  • 上篇已实现构建节点树函数接口,该篇介绍如何将代码构建的节点树按格式化打印出来。基本思路从根节点开始遍历,采用广度优先。如何广度优先呢?定义一对字符串数组,分别存放名称和数值,这对数组构成键值对。 继续...
  • 网络通信的标准流程是,服务端新建一个socket,然后在该socket中...看多个客户端或者多个连接是如何在一个监听的socket中完成通信的。服务器收到一个syn包的时候,在tcp_rcv中进行处理。该函数根据tcp数据包中的目...
  • 大家知道如何利用MySQL判断数字的奇偶么?在《php经典编程265例》中以php为运行环境,涉及到了mysql的一系列用法,今天主要给大家讲解如何在mysql中判断数字的奇偶性。《PHP经典编程265例》本书以基础知识为框架,...
  • 大虾们,神们,C# winform里面,采用多线程监听端口,接收方式为阻塞式,创建单一线程进行监听函数,这样阻塞时只阻塞单一线程,对主线程没有影响,并使用异步通信模式,来一个连接后回调函数进行解析入库。...
  • 为啥要继承 说明 能够提升代码的重用率,即开发一个类,可以在多个子功能中直接使用 ...如果你已经有了一个类,并要创建一个与之很像的类(可能只是新增了几个方法),该如何办呢?创建这个新...
  • 在PHP开发中,我们经常会对两个时间的大小...这就要用到我们前面学习的利用strtotime()函数将日期和时间解析为UNIX时间戳的知识了,只有将时间转化为时间戳的格式,才能够进行比较。本章就给大家讲解一下,在PHP中,...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 315
精华内容 126
关键字:

如何判断函数解析