uip学习笔记

合集下载

Ui框架学习笔记

Ui框架学习笔记
}; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //test.cpp #include "test.h" #include "chrome/views/window/window.h"
2.UI 消息机制....................................................................................................................................2 3.Chrome 控件树...............................................................................................................................3 4.Chrome 消息分发机制...................................................................................................................4 5.基本控件.........................................................................................................................................5

uip

uip

uIP的ARP协议代码分析之一ARP请求对于一个设备用的ARP协议而言,重要的东西包括三方面:1.一个本地的IP与MAC地址的缓存表.以有对应的更新和查询操作.2.一个发送ARP请求的函数.3.一个处理ARP回复的函数.下面我们来看uIP中是如何实现的(代码见uip_arp.c:首先,定义一个缓存表的数据结构,99行起:struct arp_entry {u16_t ipaddr[2];struct uip_eth_addr ethaddr;u8_t time;};只有三个项,很简单第一项是ip地址,16*2=4*8位的,保存四个八位组.第二项是MAC地址.第三项是缓存更新时间.下来是ARP请求发送函数:/*-----------------------------------------------------------------------------------*//*** Prepend Ethernet header to an outbound IP packet and see if we need* to send out an ARP request.*为传出的IP包添加以太网头并看是否需要发送ARP请求.* This function should be called before sending out an IP packet. The* function checks the destination IP address of the IP packet to see* what Ethernet MAC address that should be used as a destination MAC* address on the Ethernet.*此函数应该在发送IP包时调用,它会检查IP包的目的IP地址,看看以太网应该使用什么目的MAC地址.* If the destination IP address is in the local network (determined* by logical ANDing of netmask and our IP address), the function* checks the ARP cache to see if an entry for the destination IP* address is found. If so, an Ethernet header is prepended and the* function returns. If no ARP cache entry is found for the* destination IP address, the packet in the uip_buf[] is replaced by* an ARP request packet for the IP address. The IP packet is dropped* and it is assumed that they higher level protocols (e.g., TCP)* eventually will retransmit the dropped packet.*如果目的IP地址是在局域网中(由IP地址与子网掩码的与逻辑决定),函数就会从ARP缓存表中查找有*无对应项.若有,就取对应的MAC地址,加上以太网头,并返回,否则uip_buf[]中的数据包会被替换成一个*目的IP在址的ARP请求.原来的IP包会被简单的仍掉,此函数假设高层协议(如TCP)会最终重传扔掉的包.* If the destination IP address is not on the local network, the IP* address of the default router is used instead.*如果目标IP地址并非一个局域网IP,则会使用默认路由的IP地址.* When the function returns, a packet is present in the uip_buf[]* buffer, and the length of the packet is in the global variable* uip_len.函数返回时,uip_buf[]中已经有了一个包,其长度由uip_len指定.*//*-----------------------------------------------------------------------------------*/voiduip_arp_out(void){struct arp_entry *tabptr;/* Find the destination IP address in the ARP table and constructthe Ethernet header. If the destination IP addres isn't on thelocal network, we use the default router's IP address instead.//在ARP表中找到目的IP地址,构成以太网头.如果目的IP地址不在局域网中,则使用默认路由的IP.If not ARP table entry is found, we overwrite the original IPpacket with an ARP request for the IP address. *///如果ARP表中找不到,则将原来的IP包替换成一个ARP请求./* First check if destination is a local broadcast. 首先检查目标是不是广播*/if(uip_ipaddr_cmp(IPBUF->destipaddr, broadcast_ipaddr)) {memcpy(IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, 6);} else {/* Check if the destination address is on the local network. 检查目标地址是否在局域网内 */if(!uip_ipaddr_maskcmp(IPBUF->destipaddr, uip_hostaddr, uip_netmask)) {/* Destination address was not on the local network, so we need touse the default router's IP address instead of the destinationaddress when determining the MAC address. 目的地址不在局域网内,所以保用默认路由器的地址来确在MAC地址*/uip_ipaddr_copy(ipaddr, uip_draddr);} else {/* Else, we use the destination IP address. 否则,使用目标IP地址*/uip_ipaddr_copy(ipaddr, IPBUF->destipaddr);}for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {//这里遍历表,对比目的IP与ARP缓存表中的IP.tabptr = &arp_table;if(uip_ipaddr_cmp(ipaddr, tabptr->ipaddr)) {break;}}if(i == UIP_ARPTAB_SIZE) {/* The destination address was not in our ARP table, so weoverwrite the IP packet with an ARP request. 如果遍历到头没找到,将原IP包替换为ARP请求并返回*/memset(BUF->ethhdr.dest.addr, 0xff, 6);memset(BUF->dhwaddr.addr, 0x00, 6);memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);uip_ipaddr_copy(BUF->dipaddr, ipaddr);uip_ipaddr_copy(BUF->sipaddr, uip_hostaddr);BUF->opcode = HTONS(ARP_REQUEST); /* ARP request. */BUF->hwtype = HTONS(ARP_HWTYPE_ETH);BUF->protocol = HTONS(UIP_ETHTYPE_IP);BUF->hwlen = 6;BUF->protolen = 4;BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);uip_appdata = &uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN];uip_len = sizeof(struct arp_hdr);return;}/* Build an ethernet header. 如果是在局域网中,且在ARP缓存中找到了(如果没找到进行不到这一步,在上面就返回了),则构建以太网头*/memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6);}memcpy(IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6);IPBUF->ethhdr.type = HTONS(UIP_ETHTYPE_IP);uip_len += sizeof(struct uip_eth_hdr);}以上内容自325行起.下面再总结一下其基本顺序:用IPBUF->ethhdr.dest.addr来存储目的IP地址,它有可能是局域网内一主机IP,也可能是路由器IP(如果是发往外网,即原来的目的IP不在局域网内),还有可能是广播专用的IP. 先看是不是在广播:如果是广播,将IPBUF->ethhdr.dest.addr设为广播IP.再看是不是在局域网内:如果不是,则将IPBUF->ethhdr.dest.addr设为路由器IP.如果在局域网内,查看是否已经存在于ARP缓存表中:如果不在,将要发送的换成ARP请求,返回.如果已存在,则查找使用查找到的MAC地址为IP包添加以太网头.这里还要解释一些细节问题,主要是:1.如何在IP包上添加以太网头2.如果将IP包替换成ARP请求,ARP请求的格式是什么.3.广播地址这些问题将在二楼来说.将IP包替换成ARP请求部分代码(实际上IP包是放在uip_buf[]里的,这里只是将uip_buf[]填充上ARP请求即可),于uip_arp.c的388行:/* The destination address was not in our ARP table, so weoverwrite the IP packet with an ARP request. */memset(BUF->ethhdr.dest.addr, 0xff, 6);memset(BUF->dhwaddr.addr, 0x00, 6);memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);uip_ipaddr_copy(BUF->dipaddr, ipaddr);uip_ipaddr_copy(BUF->sipaddr, uip_hostaddr);BUF->opcode = HTONS(ARP_REQUEST); /* ARP request. */BUF->hwtype = HTONS(ARP_HWTYPE_ETH);BUF->protocol = HTONS(UIP_ETHTYPE_IP);BUF->hwlen = 6;BUF->protolen = 4;BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);uip_appdata = &uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN];uip_len = sizeof(struct arp_hdr);return;首先解释这里的BUF(于uip_arp.c的116行):#define BUF ((struct arp_hdr *)&uip_buf[0])可见这里的BUF就是uip_buf[],只不过这里将它取做一个struct arp_hdr的结构体:struct arp_hdr {struct uip_eth_hdr ethhdr;u16_t hwtype; //硬件类型u16_t protocol; //协议类型u8_t hwlen;u8_t protolen;u16_t opcode; //操作码struct uip_eth_addr shwaddr; //源以太网地址u16_t sipaddr[2]; //源IP地址struct uip_eth_addr dhwaddr; //目的以太网地址u16_t dipaddr[2]; //目的IP地址};struct uip_eth_hdr {struct uip_eth_addr dest;struct uip_eth_addr src;u16_t type;};这是arp_hdr的第一个成员ethhdr的类型定义,对应图片中的前三项:6+6+2,目的以太网地址,源以太网地址,2字节数据类型(ARP请求和应答为0x0806).struct arp_hdr的第二个成员u16_t hwtype,对应图片中第三项,2字节硬件类型(值为1表示以太网).struct arp_hdr的第三个成员u16_t protocol,对应图片中第四项,2字节要映射的协议地址类型(ip地址为0x0800).struct arp_hdr的第四个成员u8_t hwlen,对应图片中第五项,1字节硬件地址长度(对MAC地址来说为6).struct arp_hdr的第五个成员u8_t protolen,对应图片中第六项,1字节协议地址长度(对IP地址来说为4).struct arp_hdr的第六个成员u16_t opcode,对应图片中第七项,2字节操作码(1 ARP请求,2 ARP应答,3 RARP请求,4 RARP应答,必须字段).struct arp_hdr的第七个成员struct uip_eth_addr shwaddr,对应图片中第八项,6字节源以太网地址.struct arp_hdr的第八个成员u16_t sipaddr[2];,对应图片中第九项,2字节源IP地址.struct arp_hdr的第九个成员struct uip_eth_addr dhwaddr,对应图片中第十项,6字节目标以太网地址.struct arp_hdr的第十个成员u16_t dipaddr[2];,对应图片中第十一项,2字节目标IP地址.上面绿色的表示已经详解的,红字的表示要进一步说明的.这就是一个ARP帧的结构,可以看到,里面的源和目的以太网地址都是重复的.我们再看函数中的代码:memset(BUF->ethhdr.dest.addr, 0xff, 6);memset(BUF->dhwaddr.addr, 0x00, 6);memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);这里四个memset,重复的源和目的以太网地址一起设置了,四个memset对应图片中的1,10,2,8项.但是:对1和10两项,都是源以太网地址,但置的值是不同的,分别为0xff*6和0x00*6.为什么会这样呢?因为他们的用处不一样,见:【相关资料】ARP分组格式(帧格式,报文格式)6+6–以太网的源地址和目的地址,目的地址为全1的为广播地址注意这里说,目的地址为全为1的广播地址.什么意思?当你发送一个ARP请求是,你是想知道一个IP对应的以太网地址(即MAC地址),但是你现在不知道目的主机的以太网地址,你问谁啊?不知道问谁,这种情况下,只能是广播一下了,0xff*6就是广播地址.从图片中可以看到,ARP包是分成两部分的,前6+6+2叫做"以太网首部",它的意义就是"分组是从谁(源地址)发给谁(目的地址)的什么类型(帧类型,请求和应答为0x0806)",第二部分则是内容.来看这个例子:请求帧如下(为了清晰在每行的前面加了字节计数,每行16个字节):以太网首部(14字节)0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06ARP帧(28字节)0000: 00 010010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 370020: 00 00 00 00 00 00 c0 a8 00 02填充位(18字节)0020: 00 77 31 d2 50 100030: fd 78 41 d3 00 00 00 00 00 00 00 00以太网首部:目的主机采用广播地址,源主机的MAC地址是00:05:5d:61:58:a8,上层协议类型0x0806表示ARP。

webUI课堂笔记汇总

webUI课堂笔记汇总

Ps的基本操作1布局2工作区设置(窗口---工作区---默认复位工作区)3首选项设置(编辑--首选项--单位与标尺改为像素)4视图放大/缩小Ctrl +/- a lt +鼠标滚轮空格+鼠标左键拖动画布适合屏幕ctrl+0实际像素ctrl+15 新建ctrl+N单位:像素分辨率:72像素/英寸颜色模式:RGB 8位6保存格式psd(源文件格式)7 历史记录(后退ctrl+alt+z 前进ctrl+shift +z 还原ctrl+z)8隐藏额外辅助线ctrl+h9填充前景色alt+del 填充背景色ctrl+del填充有透明区域的图层颜色前景色alt+shift+del 背景色ctrl+shift+del10扩展画布(图像--画布大小)注意定位点的选择图层1理解图层---承载信息的容器方便独立操作和修改2图层选择--(移动工具按ctrl+鼠标左键点选;勾选移动工具选项栏中自动选择)3图层的复制Ctrl+J alt+鼠标左键拖动(移动工具)4图层的顺序上方图层遮挡下方图层Ctrl+左右中括号向下移动/向上移动ctrl+shift+[ / ]移动到最底层/最顶层5图层的多选(移动工具ctrl+shift+鼠标点选;勾选自动选择shift+鼠标点选)6组的建立ctrl+g (选中需要建组的图层)删除组的结构ctrl+shift+g注意:移动工具选项栏里组和图层的选择7网页的基本板块划分头部区域header视觉区域banner主要内容main 底部信息footer8智能对象图层a缩小后再放大不影响图片的清晰度,选中图层右键选择栅格化图层B可以记录滤镜、变形参数方便随时修改9图层的合并选中需要合并的图层ctrl+E标尺与辅助线1标尺(视图--标尺)ctrl+R2吸附作用(视图--对齐)3标尺右键选择百分比恢复到像素4隐藏辅助线ctrl+;5 锁定ctrl+alt+;选区1选区选项栏样式选择固定大小恢复到正常2查看单位(窗口--信息f8)3选区上右键选择变换选区4取消选区ctrl+D5选区的布尔运算(shift加选alt减选shift+alt相交)6载入选区,按住ctrl键点击图层的缩略图形状工具1搭建大区块(选项栏选择形状)2直线按住shift画直线3多边形工具(选项栏边数设置)4圆角矩形工具(选项栏半径设置控制圆角弧度)5路径选择工具——小黑选择整体路径6直接选择工具 ---- 小白选择独立锚点按住shift加选锚点7椭圆工具按住shift画正圆8隐藏路径线ctrl+shift+h9布尔运算(shift加选alt减选shift+alt相交)对齐与分布1对齐选中两个或两个以上图层2分布选中三个或三个以上图层字符面板1文本的创建A点文本b段落文本2退出文本编辑状态ctrl+回车3字号大小ctrl+shift+</>4字行距(大段文本字号1.5到2倍)Alt+上下方向键5字间距(大段文本间距为0)Alt+左右方向键6像素字在字符面板右下角选择“无”7中英文混排(先设置中文再设置英文)段落面板1避头尾法则:严格2首行缩进(字号的两倍)3段后空格(字号的两倍)4最后一行左对齐(强制两端对齐)PC平台网页设计规范1分辨率72像素/英寸2颜色模式RGB 8位3网页背景A纯色平铺(自适应浏览器)B渐变色或底纹平铺(自适应浏览器)C通栏大图片宽度1920像素4屏幕分辨A标准分辨率1024px/768px 有效设计内容宽度1000px 首屏高约700pxB常用分辨率1280px/800px 有效设计内容宽度1200px 首屏高约750px5设计文档大小A设计文档宽度只要大于有效设计内容宽(目的表现设计意图展现背景效果建议左右各宽出200px)B针对通栏大图片设计文档宽度1920pxPC平台字体使用规范1字体分类A图形化文字b像素字(系统字)2系统安全字中文(宋体微软雅黑黑体)西文(Arial Times) 3字号中文(12px--18px )针对正文内容西文(12px--16px )针对正文内容最小10px渐变工具1类型:线性径向角度对称菱形2渐变编辑器下方色标控制颜色上方色标控制透明度菱形色标控制渐变中心点点击添加色标删除色标拖动到下方3渐变工具选项栏其他属性A反向b勾选仿色渐变过渡更平滑c勾选透明区域支持渐变编辑器里的透明效果图层样式1添加方法:在选中图层右边空白处双击添加2复制图层:选中图层右键选中拷贝图层样式,需添加图层样式的图层上右键粘贴图层样式鼠标指到效果或fx图标上按alt复制3上方图层样式会遮挡下方样式常用属性1渐变:可以拖动渐变效果,勾选与图层对齐2描边:一般为了避免虚边产生,选择内部描边描边类型:颜色渐变图案3投影:角度(控制光源) 注意全局光的选择扩展(投影的虚化效果)大小距离自由变换工具1编辑--自由变换ctrl+T 按住shift等比例缩放2按住ctrl可以调节图像的形状(斜切扭曲的功能)3shift+alt沿中心点等比例缩放4ctrl+shift+alt调节透视功能5ctrl+T 右键选择变形图案的定义与填充1定义(编辑--定义图案)找到适合重复的图形,用选区选中图案范围定义般情况透明底色2填充(编辑--填充--图案)基本抠图工具1魔棒工具(针对纯色背景)容差值越高,相近颜色的容忍范围越大,反之,越小2钢笔工具(精确造型)A在抠图选项栏选择路径B单击产生起始锚点C左键点住拖动产生贝塞尔曲线D取消贝塞尔曲线一侧滑竿在锚点上按住alt键点击E路径转换选区ctrl+回车F在路径面板中找钢笔路径G在钢笔工具下按住alt键切换到转换点工具基本的调色工具(图像---调整)1色阶ctrl+L调整图片明暗对比关系暗部滑块向右拖动暗部变暗亮部滑块向左拖动亮部变亮灰度滑块向左拖动变亮向右拖动变暗2曲线ctrl+M 精细调色点击增加锚点,按del删除锚点3色相/饱和度ctrl+U可以单独调整图像中某个指定的颜色4色彩平衡ctrl+B原理:在图像中增加某个特定颜色的比重注意:阴影中间调高光的选择剪切蒙版1添加方法:在两个图层的中间按住alt点击2原理:通过下方图层的显示范围控制上方图层的显示3一个下方图层可以剪切多个上方图层滤镜1高斯模糊(滤镜--模糊--高斯模糊)半径值越大越模糊,反之越清晰图层蒙版1添加方法:点击图层蒙版小图标2原理:与图层捆绑在一起,用图层蒙版控制原图层的显示范围白色100%显示图层黑色100%隐藏图层灰色控制透明度3主要用画笔工具配合使用笔触大小左右中括号键[/](在英文输入法状态)4回到默认前景色背景色 D 切换x线框图1内容大纲(有什么)2信息架构(在哪里)3层级关系(内容的主次)4 一般单色(黑白灰)图层调整层1添加方法:点击调整图层图标2优点:a调色参数保留方便随时修改B针对下方所有可见图层统一调色C不破坏原图的色彩信息全屏展示类网站1应用领域:汽车、地产、美妆、影视、游戏、个人、活动2尺寸:宽度:1920px高度:1000px 有效设计内容: 3设计特点:1200px一屏显示以图为主布局灵活4必要设计元素Loadi ng 音乐开关全屏按钮内页关闭按钮5优缺点优点:画面展示感强缺点:加载速度慢不适合响应式设计画笔工具1大小调整左右中括号键(英文输入法)2大小锁定键控制笔触轮廓显示形态3画笔面板(f5)A画笔预设(选择适合画笔)B间距调整间距大小控制画线还是点形状动态---大小抖动(随机产生不同大小点)散布勾选双轴随机分散大小点画笔描边A新建图层B调试画笔(选择适合画笔调节大小粗细笔刷形态)C用钢笔工具勾选适合路径路径面板里工作路径右键选择描边路径(选择画笔勾选模拟压力)D默认在钢笔工具下按Ctrl临时切换到小白按alt切换转换点工具ctrl+alt可复制E快速填充:在画笔工具下点回车按Ctrl临时切换到小白按ctrl+shift可多选ctrl+alt 可复制图层的混合模式1用于两个或两个以上图层的混合2常用混合模式A正片叠底图片暗部色彩信息混合使图片更暗B滤色图片亮部色彩信息混合使图片更亮C叠加图片中间调混合D柔光图片中间调混合使混合更柔和通道1通道类型:原色通道原色合成通道alpha通道(非色彩通道)2概念:通过灰阶的多少显示此种颜色的比重白色100%显示黑色100%隐藏灰色:透明度3载入选区按Ctrl点击通道缩略图4半透明图像抠图A选择适合通道B载入所选通道选区C回到原合成图层ctrl+J复制图层5复杂轮廓抠图A选择边缘反差最大通道B复制通道,通过色阶、曲线进一步加大反差C用画笔、钢笔工具涂抹图像,得到黑白剪影D在通道载入选区E回到图层面板,反选选区ctrl+shift+I 复制图层ctrl+J调整边缘(针对选区边缘调整)1视图:选择背景图层(透明底色图层)2半径---选区宽度羽化---选区虚化值3用调整半径工具涂抹发丝可去掉背景色4输出选择:输出带有图层蒙版的图层响应式设计(iphone 4\5)1分辨率:72像素/英寸颜色模式:RGB 8位2尺寸A整体尺寸:4: 640px/960px 5:640px/1136px 注意文档大小宽度:B按钮尺寸最小:40px/40px 常规按钮:80px/pxC字体大小:最小24px(中文)22px(西文)最大34px系统安全字:中文:苹果丽黑微软雅黑(锐利)西文:arialD输入框:最小高:62pxE偶数原则3设计注意事项:A导航:导航图标化B图片布局:一行最多c设计风格:板块简洁4视图技巧Ctrl加减号减三次GUI展示1作用:a规范化、标准化设计元素b展示整体效果2内部区块(参考)A效果图展示b按钮和控件 c icon图标D标准色和标准字Web UI美术字体设计i字体设计A字库设计b商业标示字体c环境用字640px左右滑动多行显示(偶数)2到3张图片具有拓展性2 banner字体设计方法A选择适合字体B调节整体透视变化C统一笔画特点(在字体图层右键选择转换为形状)D统一笔画的粗细比例倾斜度(钢笔工具按Ctrl切换小白按alt切换转换点)E突出重点字字体变形的常见方法1横细竖粗法2尖角字法3柔美曲线法4书法体法。

uip移植笔记

uip移植笔记

本笔记适用于uIP1.0。

移植平台介绍:MSP430F149+cs8900a+IAR1、阅读The uIP Embedded TCP/IP Stack The uIP 1.0 Reference Manual.2、建立一个文件夹,起名myport,将uip-1.0下的uIP和lib两个文件夹拷贝过去,然后再在myport下建立app文件夹。

3、将unix子文件夹下的clock-arch.c、clock-arch.h拷贝到myport下,这个文件实现协议栈所用的时钟,由430的定时器完成,有三个函数:clock_time_t clock_time(void){return ticks;}void clock_init(void){定时器的初始化工作}__interrupt void timer_interrupt(void)/*定时器中断函数*/{++ticks;}。

4、将unix子文件夹下的uip-conf.h拷贝到myport下,这个文件实现协议栈所用的配置,按照需要修改之。

5、写cs8900a的驱动函数,这里采用8位、查询模式,替换tapdev.c 或slipdev.c。

6、将unix子文件夹下的main.c函数拷贝到myport下,这个是主调度流程,按照需要修改。

7、建立自己的工程,将以上文件包含。

8、调试,改错。

其中,uip的缓冲区是以字节数组的形式产生,为了保证它的起始地址是偶数,必须指定地址。

UDP的初始化如下void myudp_init(void){uip_ipaddr_t ipaddr;//定义IP类型变量uip_ipaddr(ipaddr, 210,29,104,88); //远程IP为210.29.104.88if(myudp_conn != NULL){uip_udp_remove(myudp_conn);//如果连接已经建立,则删除之}myudp_conn = uip_udp_new(&ipaddr, HTONS(1000));//建立到远程ipaddr,端口为1000的连接if(myudp_conn != NULL){uip_udp_bind(myudp_conn, HTONS(2000));//绑定本地端口为2000,也就是2000-->1000 发数据}}void myudp_send(char *str,short n){char *nptr;nptr = (char *)uip_appdata;memcpy(nptr, str, n);uip_udp_send(n); //发送n个数据}void newdata(){char *nptr;short len;len = uip_datalen();//读取数据长度nptr = (char *)uip_appdata; //取得数据起始指针if(len<4)myudp_send("Please check the command!\n",26);else if(strncmp(nptr,"getname",7)==0)myudp_send("My name is xiaomu.",19);else myudp_send("Unkown command!\n",16);}/*---------------------------------------------------------------------------*//** \internal* The main UDP function.*//*---------------------------------------------------------------------------*/voidmyudp_appcall(void){if(uip_udp_conn->rport == HTONS(1000)){if(uip_poll()) {myudp_send("hello\n",6);//定时时间到,发hello}if(uip_newdata()) //如果指定IP的指定端口发来数据{newdata();}}}TCP的和这个差不多,初始化时就监听端口uip_listen(HTONS(23));myudp_conn = uip_udp_new(&ipaddr, HTONS(0));//如果远程ipaddr为0,端口也为0,则可以接收来自任何ip任何端口的信息,但必须指定本地端口,即要绑定。

unix环境高级编程读书笔记

unix环境高级编程读书笔记

Unix环境高级编程读书笔记Unix环境高级编程是一本经典的计算机编程指南,它深入探讨了Unix 操作系统的各个方面,并提供了大量有关高级编程和系统级编程的知识。

在本文中,我将根据这本书的内容,为您撰写一份读书笔记,希望能够帮助您更深入地理解Unix环境的高级编程。

1. Unix环境概述Unix操作系统诞生于20世纪70年代初,在经过几十年的发展之后,成为了当今世界上最流行的操作系统之一。

Unix系统以其稳定性、可靠性和安全性而闻名,被广泛应用于服务器、工作站和嵌入式系统中。

Unix环境高级编程这本书就是帮助读者深入理解Unix操作系统的各个方面,包括文件I/O、进程控制、信号处理、线程和内存管理等内容。

2. 文件I/O文件I/O是Unix编程中的基础,Unix环境高级编程中详细介绍了文件描述符、标准I/O库、文件和目录操作等内容。

这些知识对于理解Unix系统中的文件系统操作非常重要,可以帮助开发人员更好地处理文件和目录,提高程序的效率和稳定性。

3. 进程控制Unix系统以进程为核心,Unix环境高级编程深入探讨了进程的创建、终止、信号处理、进程间通信等内容。

理解这些内容可以帮助开发人员编写更加健壮和高效的多进程程序,提高系统的并发能力和响应速度。

4. 线程和同步Unix环境高级编程还介绍了线程的创建、同步、互斥和条件变量等内容。

线程编程是Unix系统中的重要部分,了解这些知识可以帮助开发人员编写更加高效和安全的多线程程序,提高系统的并发能力和性能表现。

5. 内存管理Unix系统的内存管理也是非常复杂的,Unix环境高级编程对内存分配、共享内存、内存映射等内容进行了深入讲解。

理解这些知识可以帮助开发人员更好地管理系统内存,避免内存泄漏和内存碎片问题,提高系统的稳定性和性能。

总结回顾通过阅读Unix环境高级编程这本书,我对Unix系统的各个方面有了更深入的了解。

文件I/O、进程控制、线程和内存管理等内容让我受益匪浅,我相信这些知识对我的编程能力会有很大的提高。

IPMP学习笔记

IPMP学习笔记

IPMP学习笔记项目定义:项目是一个将被完成的有限任务,它是在一定时间内,满足一系列特定目标的多项相关工作的总称。

项目的约束要素:质量、时间、成本项目的组成要素:范围、组织、质量、费用、时间项目的特征:一次性、目标明确性、整体性项目的属性:唯一性、一次性、多目标、生命周期、相互依赖、冲突属性项目与作业的区别:项目作业项目作业独一无二重复多变的资源需求稳定的资源需求有限时间无限时间柔性组织稳定组织革命性的改变渐进性改变以完成目标为宗旨以完成任务为宗旨不均衡均衡效果性效率性目标间的不均衡均衡风险和不确定性经验性项目利益相关者:投资商/委托人、发起人、项目经理、被委托人/承约商、供应商、分包商、其他项目管理的定义:以项目为对象的系统管理方法,通过一个临时性的专门的柔性组织,对项目进行高效的计划、组织、控制和指导,以实现项目全过程的动态管理和项目目标的综合协调与优化。

项目管理的五项基本任务:计划、组织、质量管理、费用控制、进度控制项目管理与作业管理的区别:作业管理一般只对效率和质量进行考核;项目管理以任务为基础,对时间、费用、风险进行管理。

项目管理的三维管理:时间(按生命周期划分阶段)、知识(针对不同阶段,采用、研究不同的管理方法)、保障。

项目管理的要素:资源是最根本的保证,需求和目标是项目实施结果的基本要求,组织是项目运作的核心实体,环境是成功的基础。

需求=基本需求+期望要求基本需求:范围、质量、利润、成本、时间、法规。

组织包括与它要做的事相关的人和资源及相互关系,由机构和行为构成。

项目组织结构主要有职能式(利于效率)、项目单列式(利于效果)、矩阵式(两者兼备)。

项目管理与部门管理的最大区别:注重于综合性管理,有严格时间限制,组织是临时的柔性的项目管理的体制是基于团队管理的个人负责制。

项目管理的方式是目标管理。

项目管理的最基本的职能:计划、组织、评价与控制(评价是控制的基础和依据;计划必须以适于评价的方式来表达;评价的要素必须与计划要素一致;评价要保证足够的时间间隔)。

详细的processing学习笔记讲解

详细的processing学习笔记讲解

processing 学习第一天笔记Processing Month第一天连接点第一部分这篇文章中,我们来看一下如何计算一个圆周上的点的坐标,并将他们连接起来。

我们将用灵活的方式来实现基于6个点和18个点的图像计算要计算这些点的坐标,必须知道圆上的点数量和圆的半径。

本例中,我们将画12个点。

int numPoint = 12;float radius = 150;下一步,我们来算一下每个点之间的角度。

众所周知一个整圆的角度是360度或2π弧度,所以用360度除以圆上的点数,就得到两点之间的角度。

例子中使用了弧度而不是角度,是因为cos()和sin()函数的形参是弧度数,不是角度数。

Processing中有一些关于圆和半圆的常量,TWO_PI就代表了常量PI*2。

(这里的PVector其实是类型,代表这一个点)float angle = TWO_PI / numPoint;for(int i=0 ; i<numberPoints;i++){float x = cos(angle * i ) * radius;float y = sin(angle * i ) * radius;point[i] = new PVector(x,y );}我把计算的部分放在了setup()里面,把结果存在了PVector数组里,这样我们就不用在draw 函数里一遍又一遍的计算点的x、y坐标。

我还用了一个for循环,用来计算每个点的坐标,**angle*i** 会在每个循环中计算出一个点的坐标。

绘制接下来我们说一下,如何将圆上的点两两连线,我们需要用一个嵌套for循环,来遍历数组中的每一个点。

if语句用来比较i和j的数字,如果他们不相等,电脑就在这两个点之间画一条线。

如果i和j相等,说明是同一个点,那么就不用画线了。

for (int i = 0; i < numPoints; i++) {for (int j = 0; j < numPoints; j++) {if ( j != i ) {line( points<i>.x, points<i>.y,points[j].x,points[j].y );}}}源码:折叠Java 代码复制内容到剪贴板1.int numPoints = 10;2. PVector[] points = new PVector[numPoints];3. float radius =150;4.void setup()5.{6. size(450,400);7.8. float angle = TWO_PI/numPoints;9. for(int i=0;i<numPoints;i++)10. {11. float x = cos(angle * i ) * radius;12. float y = sin(angle * i ) * radius;13. points[i] = new PVector(x,y);14. }15. noLoop();16.}17.18.void draw()19.{20. smooth();21.22. PImage img;23.img = loadImage("images/laDefense.jpg");24.background(img);25. // background(0); //background(0,0,255);26.27. //fill(0,0,255);28. // fill(255,102,255);29. stroke(0,0,255,60);30. translate(width/2,height/2);31. for(int i=0;i<numPoints;i++){32. for(int j=0;j<numPoints;j++)33. {34. if(j!=i) {35. // line( points<i>.x, points<i>.y,points[j].x,points[j].y );36. line( points[i].x, points[i].y,points[j].x,points[j].y );37. }38. }39. }40.saveFrame("images/circle-connection-"+numPoints+".png");41.}成果:processing 学习第二天笔记第二天连接点第二部分今天的例子和昨天的类似,只不过我们将使用随机点代替固定点,连接点的时候也将采用不同的方式。

UI学习笔记

UI学习笔记
阅读文字。 每个段落的开始两个字最为重要,这将决定内容是 否能留住用户。 初始段落,副标题和要点都要保持醒目。 纵向扫描以对比:信息为第一维度要关注的信息, 用户寻找的是最重要而且有差异化的信息,用户扫 描的速度非常快。用户对比中会产生“定位”,从 而产生水平阅读。 横向扫描用以判断:信息为第二维度信息,信息可 以没有差异化,用户会降低扫描的速度以获取更多 有用的信息,帮助自己做判断,要不要点击到详情 页。
F模式对于那些嵌入广告的 网站是极为有用的,即使 有了广告,也不会影响到 内容。只要记住,内容为 王,导航可以让用户更深 入地浏览下去。在所有浏 览模式中,F模式就是一个 引导路线图,而不仅仅是 一个页面。因为,F模式的 网站除了顶部展示区外, 其他的内容会显得更平淡。
F式布局能够奏效的原因,在于F式布局符合用户的浏览习惯,更自然。 符合“从上到下,从左到右”的阅读模式。 但是这种阅读模式有利也有弊: 这样一来,最有价值的内容只能放置在页面顶部了。有些俗套 文本内容无法有效的引起用户注意,用户甚至连摘要都懒得读,看看标题就 “过”了 网页过分注重对“标题”和“图像”的包装,不符合内容至上的原则 在采用F式布局进行设计师,很多设计师感觉自己不像是设计师,而想是制 造噱头的“广告商”。太具备功利性,只追求一时的浏览量,不遵循“内容 为王”的原则,很多用户第一次可能感觉不错,但是看了内容后大呼上当, 可能下一次他们就不会再次访问该网页了。
2
网页浏览模式
就像你的眼睛会更快 关注到快速移动的物体, 在现实生活中,大部分的 人都会被页面中的焦点所 吸引。在这里主要介绍两 种比较常见的页面浏览模 式。
1. Z 模式
2. F 模式
1
Z 模式
Z模式的浏览模式在于网页 内容主要不是文字的页面。 不论是否因为这里有个菜单 栏,还是就仅仅因为从左到 右自上而下的阅读习惯,用 户首先关注的页头水平方向 上的内容。当视线抵达底部 时,又遵循着从左到右的习 惯模式,重复再水平扫视页 尾的最底部的内容。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

uip_buf:定义如下u8_t uip_buf[UIP_BUFSIZE + 2];所有的数据处理都是通过处理它来完成的。

比如接受的数据存储在这里,要发送的数据有会放在这里。

uip_len:uip_buf有用数据的字节uip_appdata:uip_buf第一个可用字节的指针uip_conn:总是指向当前连接的指针,定义:struct uip_conn *uip_conn;下面是TCP连接的结构,用来区别不同的TCP连接,uip_tcp_appstate_t appstate是可以读写的且在实践应用中需要重定义,其他项read-only。

struct uip_conn {uip_ipaddr_t ripaddr; /**< The IP address of the remote host. 远程主机IP地址*/u16_t lport; /**< The local TCP port, in network byte order. 本地TCP端口号,网络字节顺序*/u16_t rport; /**< The local remote TCP port, in network byte order.本地远程连接主机TCP端口号*/u8_t rcv_nxt[4]; /**< The sequence number that we expect toreceive next. */u8_t snd_nxt[4]; /**< The sequence number that was last sent byus. */u16_t len; /**< Length of the data that was previously sent. */u16_t mss; /**< Current maximum segment size for theconnection. */u16_t initialmss; /**< Initial maximum segment size for theconnection. */u8_t sa; /**< Retransmission time-out calculation statevariable. */u8_t sv; /**< Retransmission time-out calculation statevariable. */u8_t rto; /**< Retransmission time-out. */u8_t tcpstateflags; /**< TCP state and flags. */u8_t timer; /**< The retransmission timer. */u8_t nrtx; /**< The number of retransmissions for the lastsegment sent. *//** The application state. */uip_tcp_appstate_t appstate;};uip的应用事件:1.接收数据:uip_newdata()为真,即远程连接的主机有发送新数据。

uip_appdata指针指向实际数据。

数据的大小通过uIP函数uip_datalen()获得。

在数据不是被缓冲后,应用程序必须立刻启动。

2.发送数据:应用程序通过使用uIP函数uip_send()发送数据。

uip_send()函数采用两个参数;一个指针指向发送数据和数据的长度。

如果应用程序为了产生要发送的实际数据需要RAM 空间,包缓存(通过uip_appdata指针指向)可以用于这方面。

在一个时间里应用程序只能在连接中发送一块数据。

因此不可以在每个应用程序启用中调用uip_send()超过一次;只有上一次调用的数据将会发出后才可以。

注意,调用uip_send()以后会改变某些全局变量,在应用函数返回前它不能被调用。

3.重发数据:uip_rexmit()为真,应用程序要重发上一次发出的数据。

重发就好像原来那样发送,也就是通过uip_send()。

4.关闭连接:应用程序通过调用uip_close()关闭当前连接。

这会导致连接干净地关闭。

为了指出致命的错误,应用程序可以中止连接,调用uip_abort()函数完成这个工作。

如果连接已经被远端关闭,uip_closed()为真。

应用程序接着可以做一些必要的清理工作。

5.报告错误:有两个致命的错误可以发生在连接中,不是连接由远程主机中止,就是连接多次重发上一数据和被中止。

uIP通过调用函数报告这些问题。

应用程序使用两个测试函数uip_aborted()和uip _timedout() 去测试那些错误情况。

6.轮询:当连接空闲时,uIP在每一个时候周期性地轮询应用程序。

应用程序使用测试函数uip_poll()去检查它是否被轮询过。

7.监听端口IP维持一个监听TCP端口列表。

通过uip_listen()函数(在应用程序的初始化调用),一个新的监听端口打开。

当一个连接请求在一个监听端口到达,uIP产生一个新的连接和调用应用程序函数。

如果一个新连接产生,应用程序被调用,测试函数uip_connected()为真。

8. 打开连接在uIP里面通过使用uip_connect()函数打开一个新连接。

这个函数打开一个新连接到指定的IP地址和端口,返回一个新连接的指针到uip_conn结构。

如果没有空余的连接槽,函数返回空值。

为了方便,函数uip_ipaddr()可以用于将IP地址打包进两个单元16位数组里,通过uIP去代表IP地址。

例子:void connect_example1_app(void) {if(uip_connect(uip_conn->ripaddr, 8080) == NULL) {uip_abort();}}void connect_example2(void) {u16_t ipaddr[2];uip_ipaddr(ipaddr, 192,168,0,1);uip_connect(ipaddr, 8080);}9.数据流控制过函数uip_stop()和uip_restart(),uIP提供存取TCP数据流的控制途径。

设想一个应用程序下载数据到一个慢速设备,例如磁盘驱动器。

如果磁盘驱动器的作业队列满了,应用程序不会准备从服务器接收更多的数据,直到队列排出空位。

函数uip_stop()可以用于维护流控制和停止远程主机发送数据。

当应用程序准备好接收更多数据,函数uip_restart()用于告知远程终端再次发送数据。

函数uip_stopped()可以用于检查当前连接是否停止。

有了以上的知识,相信编写uip应用程序就简单多了。

有三个函数在编写程序时调用:uip_init()(系统初始化时调用)、uip_input()(接受到数据时调用)、uip_periodic()(隔一段时间调用,0.5s)当用到特定的功能时还需相应的调用如下函数:uip_udp_periodic()、uip_arp_timer()以上具体函数的用法在uip代码注释中有详解。

移植uip时要编写三个底层函数:void tapdev_init(void)(特定底层网络芯片的初始化函数)、unsigned int tapdev_read(void)、void tapdev_send(void)编写main()循环时可以参照unix文件夹下的main.c。

#define UIP_APPCALL你的应用函数名(不是上面所说的main函数,main函数只是调用uip的接口函数)(uip协议栈会调用这个函数,按照你的要求处理数据)所有uIP提供的函数1.ARP地址解析协议:ARP协议映射了IP地址和以太网MAC物理地址,它在以太网上的TCP/IP操作是需要的。

ARP在uIP里实现的是包含一个IP到MAC地址的映射。

当一个IP包要在以太网上发出,查询ARP表,去找出包要发送去的MAC地址。

如果在表里找不到IP地址,ARP请求包就会发出。

请求包在网络里广播和请求给出IP地址的MAC地址。

主机通过发出一个ARP回应,响应请求IP地址。

当uIP给出一个ARP回应,更新ARP表。

为了节省储存器,一个IP地址的ARP请求覆盖发出的请求输出IP包。

它是假定上层将重新发送那些被覆盖了的数据。

每十秒表更新一次,旧的条目会被丢弃。

默认的ARP表条目生存时间是20分钟。

2.IP网际协议:uIP的IP层代码有两个职责:验证输入包的IP头的正确性和ICMP 和TCP 协议之间多路复用。

IP层代码是非常简单的,由9条语句组成。

事实上,uIP的IP层极大地简化了,它没有实现碎片和重组。

3.ICMP因特网信息控制协议:在uIP里,只有一种ICMP信息实现了: ICMP回响信息。

ICMP回响信息常常用于ping程序里的检查主机是否在线。

在uIP里,ICMP回响处理在一个非常简单的方式。

ICMP类型字段的改变是从 \echo"类型到 \echo reply"类型,从而 ICMP调整校验和。

其次,IP地址里的IP头交换,包发回到原先的发送者。

4.TCP传输控制协议:为了减少储存器的使用,uIP里的TCP没有实现发送和接收数据的调整窗口。

输入的TCP段不会通过uIP缓存,但必须立即由应用程序处理。

注意这不能避免应用程序自己缓冲数据。

输出数据时,uIP不能在每个连接有超过一个未解决的TCP段。

连接状态在uIP,每个TCP连接的完全态包含当地和远端的TCP端口编号,远程主机的IP地址,重发时间值,上一段重发的编号,和连接的段的最大尺寸。

除此之外,每个连接也可以保持一些应用状态。

三个序列号是,期望接收的下一个字节的序列号,上一发送段第一字节的序列号,下一发送字节的序列号。

连接的状态由uip_conn结构表现,可以在图5看到。

一个uip_conn结构数组用于在uIP里保持所有的连接。

数组的大小等于同时的最大数量的连接,它在编译时间里设置。

struct uip_conn {u8_t tcpstateflags; /* TCP状态和标志. */u16_t lport, rport; /*当地和远端端口. */u16_t ripaddr[2]; /*同等远端的IP地址. */u8_t rcv_nxt[4]; /* 我们期待接收的下一个序列号. */u8_t snd_nxt[4]; /*上一个发送的序列号. */u8_t ack_nxt[4]; /* 通过从远端的下一个应答去应答序列号. */u8_t timer; /* 重发时间r. */u8_t nrtx; /*计算特殊段的重发数量. */u8_t mss; /* 连接的最大段大小. */u8_t appstate[UIP_APPSTATE_SIZE];};图5: uip_conn 结构输入处理TCP输入处理和检验TCP校验和一起开始。

相关文档
最新文档