2010年1月17日星期日

网络编程小结

1. 如果在已经处于
ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:
  BOOL bReuseaddr=TRUE;
  setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const
char*)&bReuseaddr,sizeof(BOOL));

  2.
如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:
  BOOL bDontLinger = FALSE;
  setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const
char*)&bDontLinger,sizeof(BOOL));

  3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
  int nNetTimeout=1000;//1秒
  //发送时限
  setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char
*)&nNetTimeout,sizeof(int));
  //接收时限
  setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char
*)&nNetTimeout,sizeof(int));

  4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:
  // 接收缓冲区
  int nRecvBuf=32*1024;//设置为32K
  setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
  //发送缓冲区
  int nSendBuf=32*1024;//设置为32K
  setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
  
  5.
如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能:
  int nZero=0;
  setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
  
  6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):
  int nZero=0;
  setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));

  7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:
  BOOL bBroadcast=TRUE;
  setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const
char*)&bBroadcast,sizeof(BOOL));
  
  8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)
  BOOL bConditionalAccept=TRUE;
  setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const
char*)&bConditionalAccept,sizeof(BOOL));

  9.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们一般采取的措施是"从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体应用的要求(即让没发完的数据发送出去后在关闭socket)?
  struct linger {
  u_short l_onoff;
  u_short l_linger;
  };
  linger m_sLinger;
  m_sLinger.l_onoff=1;//(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
  // 如果m_sLinger.l_onoff=0;则功能和2.)作用相同;
  m_sLinger.l_linger=5;//(容许逗留的时间为5秒)
  setsockopt(s,SOL_SOCKET,SO_LINGER,(const
char*)&m_sLinger,sizeof(linger));
  Note:1.在设置了逗留延时,用于一个非阻塞的socket是作用不大的,最好不用;
  2.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER,或者设置l_onoff=0;
  
  10.还一个用的比较少的是在SDI或者是Dialog的程序中,可以记录socket的调试信息:
  (前不久做过这个函数的测试,调式信息可以保存,包括socket建立时候的参数,采用的
  具体协议,以及出错的代码都可以记录下来)
  BOOL bDebug=TRUE;
  setsockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL));
  
  11.附加:往往通过setsockopt()设置了缓冲区大小,但还不能满足数据的传输需求,我的习惯是自己写个处理网络缓冲的类,动态分配内存。

ubuntu 使用xp下的打印机

ubuntu要使用window xp下共享的打印机,需先安装samba:

sudo aptitude install samba

然后,进入"系统-系统管理-打印",新建打印机。选最下面的"网络打印机",Windows
Printer via SAMBA,
输入IP地址和用户名密码,浏览一下共享的打印机,并选择如hpLaserJ。进入后驱动选一种品牌,如HP。选相应的型号,如HP
LaserJet 1300 Series Postscript [en][推荐]。完成。

打印机地址类似: smb://192.168.12.112/hpLaserJ

即可打印。

搭建嵌入式QT开发环境 

推荐网上看了好多关于Qt开发平台搭建的帖子,但发现上面的帖子都比较旧,是针对Qt旧版本而写的。本人喜欢用较新版的东西,相信新版的东西肯定比旧版的东西
好用,果不其然Qt的新版本真的很好用,而且搭建起来更加容易。刚开始接触的时候,Qt的众多版本搞的自己头昏脑涨,什么Qt/x11,Qt
/win,Qt/embedded ,Qtopia
core,Qtopia等等,真的是丈二和尚摸不着头脑,幸好有网络,上网总能找到自己想要的东西,而且又不需要给予别人回报,当然自己也有些责任共享自
己的资料,看来共产主义在互联网已经开始萌芽了,哈哈。

先看看Qt的各个版本简介:

1.什么是QT

Qt是一个完整的C++应用程序开发框架。它包含一个类库,和用于跨平台开发及国际化的工具。Qt
API在所有支持的平台上都是相同的,Qt工具在这些平台上的使用方式也一致,
因而Qt应用的开发和部署与平台无关。

2.什么是Qtopia

Qtopia
是一个面向嵌入式Linux的全方位应用程序开发平台,同时也是用于基于Linux的PDA(个人数字助理),智能电话(Smartphone)以及其他
移动设备的用户界面。简单地说,Qtopia实质上是一组关于PDA和智能电话的应用程序结合,如果需要开发这类产品可以在这组程序的基础上迅速构建出
PDA或者智能电话。Qtopia实质上依赖Qt/Embedded。

3.什么是Qt/Embedded

Qt/Embedded
是一个完整的自包含GUI和基于Linux的嵌入式平台开发工具。这个开发工具的名字好像最容易混淆,当然Qt/Embedded是最熟悉的名字,好像
Qtopia
Core说的也是它。最近,奇趣公司又该名字了,它的新名字叫做qt-embedded-linux-xxxx,看来这个Qt/Embedded的马甲还
很多哈。

下面就是搭建Qt开发平台了,我的平台是fedora core
7,需要的Qt版本有两个:

qt-x11-opensource-src-4.3.2.tar.gz

qt-embedded-linux-opensource-src-4.4.0-rc1.tar.bz2

qt-x11版本可以产生Qt开发工具,如designer等等,最重要的是可以得到qvfb,嵌入式的开发有了qvfb,就可以不需要实际的开发板,也可以开发Qt应程序。qt-embedded版本就是专门用于嵌入式方面的版本。下面是安装步骤:

1. 解压这两个qt包

a) tar –jxvf qt-x11-opensource-src-4.3.2.tar.gz

b) tar –jxvf
qt-embedded-linux-opensource-src-4.4.0-rc1.tar.bz2

c) cp qt-embedded-linux-opensource-src-4.4.0-rc1
qt-embedded-linux-opensource-src-4.4.0-rc1-x86

d) mv qt-embedded-linux-opensource-src-4.4.0-rc1
qt-embedded-linux-opensource-src-4.4.0-rc1-arm

这里,qt-embedded有两个复制:qt-embedded-linux-opensource-src-4.4.0-rc1-x86
和qt-embedded-linux-opensource-src-4.4.0-rc1-arm,根据他们的名字可以知道前者是适合x架构的,后者适
合arm架构为什么需要两个呢?如果有开发板的话,可以只编译qt-embedded版本成arm架构的就可以了,但是很多时候用qvfb的话,开发会方
便很多,所以多编译一个x86架构的也不错。这里是否有些疑问,qt-x11也是适合x86结构的,这不是和qt-embedded重复了吗?答案是这样
的,qt-embedded版本只能在嵌入式板子上面运行,编译成x86架构的程序也只能在x86的嵌入式板子上跑。前面说过,我们需要qvfb来开发,
但是qvfb只能执行x86架构的应用程序,所以需要让qt-embedded生成关于x86的库和其他文件。而将qt-embedded编译成arm,
又是为什么呢?道理很简单,我最终的qt应用程序需要在arm架构上面运行,当然需要这方面的库,所以编译成arm也就顺理成章了。好了,现在简单的总结
一下,首先,使用qt-x11提供的库和开发工具开发出qt应用程序,然后使用qt-embedded关于x86库和工具再次编译我们开发qt应用程序,
这是所得到的可执行文件就可以在qvfb上运行了,最后,使用qt-embeddedd的arm库再次编译就可以得到在arm上能运行的可执行程序。很明
显,如果有开发板,第二步是可要可不要的(最好是要),如果没有开发板的话,第三步也就没必要了,这样就不需要将qt-embedded编译成适合arm
架构的。

-----------------------------------------------------------

具体步骤与说明:

1. 下载源码包

qt-x11-opensource-src-4.5.0.tar.bz2

qt-embedded-linux-opensource-src-4.5.0.tar.bz2

下载地址:ftp://ftp.qtsoftware.com/qt/source/

2.编译及安装qt-x11-opensource-src-4.5.0

qt-x11版本可以产生Qt开发工具,如designer等等,最重要的是可以得到qvfb,嵌入式的开发有了qvfb,就可以不需要实际的开发板,也可以开发Qt应程序。qt-embedded版本就是专门用于嵌入式方面的版本。

tar xjvf qt-x11-opensource-src-4.5.0.tar.bz2

cd qt-x11-opensource-src-4.5.0

./configure

make

make install

历经漫长的编译过程,约一个半小时,默认安装在/usr/local/Trolltech/Qt-4.5.0下.编译完成后源程序不要删除,还有用。

3.编译及安装qt-embedded-linux-opensource-src-4.5.0

在用户目录下建立一个src目录,用于存放编译源文件qt-embedded-linux-opensource-src-
4.5.0.tar.bz2。将其解压得到qt-embedded-linux-opensource-src-4.5.0,重命名为qt-
embedded-linux-opensource-src-4.5.0-x86.
再次解压qt-embedded-linux-opensource-src-4.5.0.tar.bz2,并重命令为qt-embedded-
linux-opensource-src-4.5.0-arm.为什么有两个复制呢?我们可以从他们的名字上就不难看出前者是适合x架构的,后者适合
arm架构的,如果有开发板的话,可以只编译qt-embedded版本成arm架构的就可以了,但是很多时候用qvfb的话,开发会方便很多,所以多编
译一个x86架构的也不错。

mkdir ~/src

mv qt-embedded-linux-opensource-src-4.5.0.tar.bz2 ~/src

tar xjvf qt-embedded-linux-opensource-src-4.5.0.tar.bz2

mv qt-embedded-linux-opensource-src-4.5.0
qt-embedded-linux-opensource-src-4.5.0-x86

tar xjvf qt-embedded-linux-opensource-src-4.5.0.tar.bz2

mv qt-embedded-linux-opensource-src-4.5.0
qt-embedded-linux-opensource-src-4.5.0-arm

cd qt-embedded-linux-opensource-src-4.5.0-x86

./configure -prefix /usr/local/Trolltech/QtEmbedded-4.5.0-x86
-embedded
x86 -qvfb

make

make install

-------OK!qt-embedded-x86被安装在/usr/local/Trolltech/QtEmbedded-4.5.0-x86下.

cd qt-embedded-linux-opensource-src-4.5.0-arm

./configure -prefix /usr/local/Trolltech/QtEmbedded-4.5.0-arm
-embedded
arm

make

make install

-------OK!qt-embedded-arm被安装在/usr/local/Trolltech/QtEmbedded-4.5.0-arm下.

4.至此我们已经安装好了qt-x11版,即在PC机上运行的QT,qt-embedded-x86版(x86体系的嵌入式板子上运行的QT)和qt-embedded-arm(arm板子上运行的QT).下一步:设置环境变量

(1)qt-x11:

vi setenv.sh

添加如下内容:

PATH=/usr/local/Trolltech/Qt-4.5.0/bin:$PATH

LD_LIBRARY_PATH=/usr/local/Trolltech/Qt-4.5.0/lib:$LD_LIBRARY_PATH

保存退出.移到/usr/local/Trolltech/Qt-4.5.0中。

(2)qt-embedded-x86:

vi setenv.sh

添加如下内容:

QTEDIR=/usr/local/Trolltech/QtEmbedded-4.5.0-x86

PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-x86/bin:$PATH

LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-x86/lib:$LD_LIBRARY_PATH

保存退出.移到/usr/local/Trolltech/QtEmbedded-4.5.0-x86中。

(3)qt-embedded-arm:

vi setenv.sh

添加如下内容:

QTEDIR=/usr/local/Trolltech/QtEmbedded-4.5.0-arm

PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-arm/bin:$PATH

LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib:$LD_LIBRARY_PATH

保存退出.移到/usr/local/Trolltech/QtEmbedded-4.5.0-arm中。

我们在运行的时候分别运行对应的脚本即可,比如我们要用qt-x11:

cd /usr/local/Trolltech/Qt-4.5.0

source setenv.sh

然后就可以用qmake designer等工具了.

5.做到这一步还有qvfb没有编译,到qt-x11-opensource-src-4.5.0中重新编译qvfb即可

cd qt-x11-opensource-src-4.5.0

cd /tools/qvfb

make
--会在qt-x11-opensource-src-4.5.0/bin下生成qvfb,我们将它copy至/usr/local/Trolltech/QtEmbedded-4.5.0-x86/bin下

cp ../..bin/qvfb /usr/local/Trolltech/QtEmbedded-4.5.0-x86/bin

6.做一个测试

cd /usr/local/Trolltech/QtEmbedded-4.5.0-x86

source setenv.sh

cd /usr/local/Trolltech/QtEmbedded-4.5.0-x86/demos/books

qvfb -width 640 -height 480 &

./books -qws

-----------------------------------------------------------
出错信息一般为
Error opening buffer device /dev/fb0QScreenLinuxFb::connect: No such file
or
directory这种情况发生最多的是编译Qt-Embedded的x86版本,希望在qvfb上运行应用时
使用者在
第一步运行qvfb后
第二步运行./myapp -qws
出现以上的提示错误

原因是Qt-Embedded在查找系统的显示设备时,默认去寻找LinuxFb,也即Linux的/dev/fb0设备,但是如果Qt-
Embedded安装了其它显示设备,比如qvfb,则可以在qvfb上显示,但是需要一个插件(或者说驱动,可能会和设备驱动混淆),使Qt-
Embedded能使用qvfb。
为了作到这一点,需要在编译Qt-Embedded时的configure命令加上如下选项
./configure -plugin-gfx-qvfb -plugin-kbd-qvfb -plugin-mouse-qvfb
或./configure -qt-gfx-qvfb -qt-kbd-qvfb
-qt-mouse-qvfb如果,你不想重新编译Qt-Embedded,也可以单独编译qvfb的gfxdrivers,命令如下
$ cd
qt-embedded-linux-opensource-src-4.5.1/src/plugins/gfxdrivers/qvfb/$/usr/local/Trolltech/QtEmbedded-4.5.1/bin/qmake$
sudo make install对应所在的路径,在大家的机器上可能不尽相同,领会意思就行

大小端、网络字节序问题

 
 

Sent to you by solo via Google Reader:

 
 

via eros的技术资料库 by 风 on 1/8/10

linux的大小端、网络字节序问题


 
 

Things you can do from here: