linux send recv函数详解

因在写作业的时候遇到点问题,所以就很自然的想到在网上找找答案,看到了这篇文章,感觉挺有用的,所以转过来记录一下,以便将来查找方便,原文链接地址就点击这里查看。

int send( SOCKET s, const char *buf, int len, int flags );

不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。

该函数的第一个参数指定发送端套接字描述符;

第二个参数指明一个存放应用程序要发送数据的缓冲区;

第三个参数指明实际要发送的数据的字节数;

第四个参数一般置0。

这里只描述同步Socket的send函数的执行流程。当调用该函数时,

(1)send先比较待发送数据的长度len和套接字s的发送缓冲的长度, 如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;

(2)如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len

(3)如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完

(4)如果len小于剩余 空间大小,send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。

如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。

要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执 行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回 SOCKET_ERROR)

注意:在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

通过测试发现,异步socket的send函数在网络刚刚断开时还能发送返回相应的字节数,同时使用select检测也是可写的,但是过几秒钟之后,再send就会出错了,返回-1。select也不能检测出可写了。

2. recv函数

int recv( SOCKET s, char *buf, int len, int flags);

不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符;

第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;

第三个参数指明buf的长度;

第四个参数一般置0。

这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,

(1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,

(2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),

recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。

注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

利用synergy实现Windows与Ubuntu鼠标和键盘共享

        昨天无意中在一学长那看到鼠标可以在两个桌面间自由切换,刚开始以为是多显示器设置,后来一问才知道是在两台独立的电脑间,很自然的我也想试试喽!原来是synergy,一个神通广大的跨平台桌面应用软件,访问官网请点击这里,本文主要简单介绍一下我的配置方法。

        实验室的台式机由于学习需要装的是win7,而自己的笔记本一般都用Ubuntu,刚开始还曾担心不支持跨平台,看来是自己桤人忧天了。在官网下载好相应的版本安装后,接下来就是配置问题了。在网上搜了很多,但看了看最终还是放弃了,一个比一个复杂,自己试试吧!
        首先说明Win7作为Server端,Ubuntu作为Client端,即Ubuntu共享台式机的键盘和鼠标。程序主界面如下图所示:
synergy主界面
点击【Configure Server…】按钮,会出现如下图所示窗口:

桌面设置        这里就是设置多屏幕位置之间的关系,作为Server端,会默认在最中央,我的Server端即是图中左侧所示的计算机图标(可以用鼠标随意拖动),而右侧的ubuntu计算机图标是点击右上角的计算机图标添加的。下面的【ubuntu】字样是我笔记本电脑的hostname,自己设置时注意改为系统的hostname。然后点击【OK】回到上一层窗口,再点击【start】,至此,Win7的Server端就设置成功了。

        接下来是配置Ubuntu系统的客户端,最新版的Ubuntu系统安装软件也十分方便,跟Windows下差不多。相比起synergy的Server端,Client端的设置就相当简单了,在主程序界面选择Client,然后在下面的文本框内填入Server端的IP地址,点击【start】就可共享Server端的鼠标和键盘了,真的非常非常方便。

        如果你有更好更方便的配置方法,不妨告诉我哦!

Linux下dd命令详解

昨天看了周鸿祎写的一篇关于乔布斯的博文《乔布斯的拿来主义》,深有体会,建议大家可以看看!当然,本文的目的不是讨论博文的内容,甚至与博文内容一点关系也没有,只是在看书的过程中偶遇一个新的Linux命令,于是上网搜了一下,顺便拿来己用!

1.dd命令简介

功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。可以用该命令实现DOS下的diskcopy命令的作用。先用dd命令把软盘上的数据写成硬盘的一个寄存文件,再把这个寄存文件写入第二张软盘上,完成diskcopy的功能。需要注意的是,应该将硬盘上的寄存文件用rm命令删除掉。系统默认使用标准输入文件和标准输出文件。

语法:dd [选项]

if =输入文件(或设备名称)。

of =输出文件(或设备名称)。

ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。

skip = blocks 跳过读入缓冲区开头的ibs*blocks块。

obs = bytes 一次写入bytes字节,即写入缓冲区的字节数。

bs = bytes 同时设置读/写缓冲区的字节数(等于设置ibs和obs)。

cbs = byte 一次转换bytes字节。

count=blocks 只拷贝输入的blocks块。

conv = ASCII 把EBCDIC码转换为ASCIl码。

conv = ebcdic 把ASCIl码转换为EBCDIC码。

conv = ibm 把ASCIl码转换为alternate EBCDIC码。

conv = block 把变动位转换成固定字符。

conv = ublock 把固定位转换成变动位。

conv = ucase 把字母由小写转换为大写。

conv = lcase 把字母由大写转换为小写。

conv = notrunc 不截短输出文件。

conv = swab 交换每一对输入字节。

conv = noerror 出错时不停止处理。

conv = sync 把每个输入记录的大小都调到ibs的大小(用NUL填充)。

2.实例分析

2.1.数据备份与恢复

2.1.1整盘数据备份与恢复
备份:

dd if=/dev/hdx of=/dev/hdy
将本地的/dev/hdx整盘备份到/dev/hdy

dd if=/dev/hdx of=/path/to/image
将/dev/hdx全盘数据备份到指定路径的image文件

dd if=/dev/hdx | gzip >/path/to/image.gz
备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径

恢复:
dd if=/path/to/image of=/dev/hdx
将备份文件恢复到指定盘

gzip -dc /path/to/image.gz | dd of=/dev/hdx
将压缩的备份文件恢复到指定盘

2.1.2.利用netcat远程备份

dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234
在源主机上执行此命令备份/dev/hda

netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
在目的主机上执行此命令来接收数据并写入/dev/hdc

netcat -l -p 1234 | bzip2 > partition.img
netcat -l -p 1234 | gzip > partition.img
以上两条指令是目的主机指令的变化分别采用bzip2 gzip对数据进行压缩,并将备份文件保存在当前目录。

2.1.3.备份MBR
备份:

dd if=/dev/hdx of=/path/to/image count=1 bs=512
备份磁盘开始的512Byte大小的MBR信息到指定文件

恢复:

dd if=/path/to/image of=/dev/hdx
将备份的MBR信息写到磁盘开始部分

2.1.4.备份软盘

dd if=/dev/fd0 of=disk.img count=1 bs=1440k
将软驱数据备份到当前目录的disk.img文件

2.1.5.拷贝内存资料到硬盘

dd if=/dev/mem of=/root/mem.bin bs=1024
将内存里的数据拷贝到root目录下的mem.bin文件

2.1.6.从光盘拷贝iso镜像

dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件

2.2.增加Swap分区文件大小

dd if=/dev/zero of=/swapfile bs=1024 count=262144
创建一个足够大的文件(此处为256M)

mkswap /swapfile
把这个文件变成swap文件

swapon /swapfile
启用这个swap文件

/swapfile swap swap defaults 0 0
在每次开机的时候自动加载swap文件, 需要在 /etc/fstab 文件中增加一行

2.3.销毁磁盘数据

dd if=/dev/urandom of=/dev/hda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/hda1将无法挂载,创建和拷贝操作无法执行。

2.4磁盘管理

2.4.1.得到最恰当的block size

dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小

2.4.2测试硬盘读写速度

dd if=/root/1Gb.file bs=64k | dd of=/dev/null
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度

2.4.3.修复硬盘

dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生magnetic flux point。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。

2.4.4.软盘拷贝

要把一张软盘的内容拷贝到另一张软盘上,利用/tmp作为临时存储区。把源盘插入驱动器中,输入下述命令:

$ dd if =/dev/fd0 of = /tmp/tmpfile

拷贝完成后,将源盘从驱动器中取出,把目标盘插入,输入命令:

$ dd if = /tmp/tmpfile of =/dev/fd0

软盘拷贝完成后,应该将临时文件删除:

$ rm /tmp/tmpfile

 

2.4.5.把net.i这个文件写入软盘中,并设定读/写缓冲区的数目。

(注意:软盘中的内容会被完全覆盖掉)

$ dd if = net.i of = /dev/fd0 bs = 16384

 

2.4.6.将文件sfile拷贝到文件 dfile中。

$ dd if=sfile of=dfile

来自: http://hi.baidu.com/zifengshen/blog/item/7272b2f20476dd19b07ec5c7.html

版本控制器简介

  最近一直想静下心来认真地看一本书《Unix环境高级编程》,直到现在才看完前四章,而且里面还有许多不理解的地方,似乎有点心灰意冷了,哈哈……每次感觉不爽的时候就想去游泳,谁让自己刚学会,一下子对其它运动项目失去了以往浓厚的兴趣呢。至于为什么会突然提到版本控制器,哈哈……真有点天马行空的感觉!
  源代码版本控制机制是现代软件开发中必不可少的管理机制之一,通常要借助版本控制软件来实现。版本控制在软件开发中的重要作用有以下两点:
  一、作为代码仓库有效地管理软件开发中各个不同版本的源代码和文档,占用空间小且方便各个版本代码和文档的获取。
  二、对开发小组中对源代码的访问进行有效的协调(不同的版本控制软件采用不同的协调策略)。
  我自己接触过的版本控制器主要有三种:VSS,SVN和Git,其中前两种或多或少使用过,Git目前正在学习中,先简单介绍一下它们吧。
  VSS的全称为Visual Source Safe,作为Microsoft Visual Studio的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目,其局限性是不支持跨平台,目前只能用于Windows平台。
  SVN(subversion)是近年来崛起的版本管理工具,是CVS的接班人。目前绝大多数开源软件都使用SVN作为代码版本管理软件。
  Git–The stupid content tracker,即傻瓜内容跟踪器。Git是用于Linux内核开发的版本控制工具,与常用的版本控制工具CVS,Subversion等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。Git的速度很快,这对于诸如Linux kernel这样的大项目来说自然很重要,它最为出色的就是它的合并跟踪(merge tracing)能力。
  至于每个版本控制器的用法大家可以在网上查找相关资料阅读,因为每个版本控制器的说明文档都很大。我想说的是在软件开发过程中选择合适的版本控制器很重要,而且在使用之前一定要对编码人员进行基础培训,切不可马虎大意,否则真正出现问题时你想哭都哭不出来。
  以下是你可能会经常访问的站点,提供各自的使用说明文档和下载链接。
  VSS_百度百科
  SVN_百度百科
  Git_百度百科
  Subversion中文站
  Git wiki

跟上HTML5步伐 程序员需要掌握的技术(转)


        摘要: Justin James列出了程序员需要掌握的核心技术,以便跟上游戏规则的颠覆者HTML5的步伐。

        利用web技术进行应用开发的趋势已深入人心,甚至web浏览器以外亦是如此。最近披露Windows 8将会为编写运用HTML 5技术的应用提供支持只不过是契合了其在开发界的转变而已。因此问题是:你打算如何应对?

        如果你没有在一直地密切跟踪,很容易就会做出这样的猜测,为什么突然之间Web技术会扮演桌面应用开发平台的角色。在正在定稿的HTML5标准里面,添加了一些新的项目,这些项目为HTML目前的文档格式附加上了真正的应用开发能力。过去,庞大的JavaScript框架及浏览器插件是某些相当琐碎的功能之所需。

        HTML5依靠添加对视频流、多线程以及异步处理(通过“Web Workers”消息传递系统)、利用套接字直接通信等的支持来改变这场游戏。尽管一个文档格式标准拥有这些能力会吓到某些人(包括我本人在内),但是车轮滚滚,这仍是HTML 5的前进方向,而且它还有苹果、微软、谷歌、Mozilla、Adobe等公司给它撑腰。此外,各种不同的框架的存在让它能够轻易地将Web应用直接与后台的Web服务连接起来。其结果是,对于许多任务来说,HTML 5现在跟Silverlight、Flash、Flex/AIR以及JavaFX等技术一样出色(尽管在某些事情上那些仍做得更好)。

        以下就是你希望学习来步入此门槛的技术:

        HTML5: 尽管HTML5作为标准可能尚未完全确定,但是到了这个阶段变动不会太大了。目前,它已经是可用的,并在相当一些浏览器上有了实现。你现在可以开始学习它了。

        CSS: 如果你对CSS还不熟悉,现在正是学习它的大好时机。浏览器支持还在不断完善,且现在IE6在市场的份额已经很少,对此开发人员已经觉得可以放心地忽略不计。

        Web services: 每一种主流的服务器端开发语言都拥有一个框架或一套库,以便容易地生成web服务,如.NET中的Windows Communication Foundation (WCF)。理解这些基础应该不需要花费太多的学习精力。你也许特别希望学会如何生成JSON的输出,此物正在迅速变成Web应用的通用语。还有,确保你理解了RESTful Web服务。在现代的开发环境下,相对于SOAP来说,尽管它们可能需要花费更多的功夫,但是其可访问性可用性也要高得多。

        JavaScript: 相对于传统的ASP.NET或类似开发需求来说,新的应用开发范式需要多一点JavaScript方面的知识。

        jQuery:jQuery已经成为可用的客户端开发框架;它似乎可用包办一切。在利用一组扩展的插件的情况下,如果你想玩点UI的花样,很可能jQuery能帮你忙。

        这些技术现在构成了若干不同的开发系统的基础。移动网站就是一条好的途径,靠它可用最少的功夫来达到最多的移动用户。像Appcelerator的Titanium那样的工具允许你在若干平台上(包括桌面和移动)在其系统之内使用web技术。其他的系统,像OutSystem的Agile Platform(免责声明:我跟他们有一些关系,在我的信息披露中有解释)打包了像jQuery这样的库,使得开发桌面或移动web应用变得极其简单。Windows 8,尽管细节仍很含糊,看起来似乎会拿IE9(或彼时的当前版本)作为HTML 5的运行环境,来充当脱离明显的浏览器窗口之外的本地应用。可以推断,这些应用会拥有增强的特权来访问本地资源,也可能其行为会更像是本地应用。

        自学上述核心技术可谓聪明的一步,今年9月微软的BUILD大会举办过后,我们就应该了解到该公司Windoes 8的策略调整计划,并能发现还有哪些东西需要我们去学。
==============================================================================
        原文链接请点击这里!

第 1 页,共 3 页123
回到顶部

Hi,everyone

我是小刚,刚在这里安家,以后会在这里记录生活的点点滴滴,欢迎大家常来做客!