📄 如何编写linux下的客户机-服务器软件-xxlinux_com.htm
字号:
title=Ubuntu下两个项目管理工具Dia和Planner介绍
href="http://www.xxlinux.com/linux/article/development/soft/20071101/11438.html"
target=_blank>Ubuntu下两个项目管理工具Dia和</A></TD></TR>
<TR>
<TD height=20>·<A title=Linux串口编程分析
href="http://www.xxlinux.com/linux/article/development/soft/20071029/11228.html"
target=_blank>Linux串口编程分析</A></TD></TR>
<TR>
<TD height=20>·<A
title=在Ubuntu下建立PowerPC405EP的开发环境
href="http://www.xxlinux.com/linux/article/development/soft/20071024/10909.html"
target=_blank>在Ubuntu下建立PowerPC405EP的</A></TD></TR>
<TR>
<TD height=20>·<A title=程序员的VI编辑器简明教程
href="http://www.xxlinux.com/linux/article/development/soft/20071023/10824.html"
target=_blank>程序员的VI编辑器简明教程</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=middle
background=如何编写Linux下的客户机-服务器软件-xxlinux_com.files/side_bg_r2_c1.gif
height=4>
<SCRIPT type=text/javascript><!--
google_ad_client = "pub-3701573918329010";
google_ad_width = 120;
google_ad_height = 240;
google_ad_format = "120x240_as_rimg";
google_cpa_choice = "CAAQpfWujAIaCNr1I9Q-PDMiKJPM93M";
google_ad_channel = "";
//--></SCRIPT>
<SCRIPT src="如何编写Linux下的客户机-服务器软件-xxlinux_com.files/show_ads.js"
type=text/javascript>
</SCRIPT>
</TD></TR>
<TR>
<TD align=middle></TD></TR></TBODY></TABLE></TD>
<TD width=1 bgColor=#b4b4b4></TD>
<TD width=1 bgColor=#ffffff></TD>
<TD width=1></TD>
<TD vAlign=top align=middle width=553>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD align=middle bgColor=#ffffff><!-- SiteSearch Google -->
<FORM action=http://www.google.cn/custom method=get target=_top>
<TABLE bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD vAlign=top noWrap align=left height=32><A
href="http://www.google.com/"><IMG alt=Google
src="如何编写Linux下的客户机-服务器软件-xxlinux_com.files/Logo_25gry.gif"
align=middle border=0></IMG></A> </TD>
<TD noWrap><INPUT type=hidden value=xxlinux.com
name=domains></INPUT> <INPUT maxLength=255 size=45
name=q></INPUT> <INPUT type=submit value=搜索 name=sa></INPUT>
</TD></TR>
<TR>
<TD> </TD>
<TD noWrap>
<TABLE>
<TBODY>
<TR>
<TD><INPUT type=radio value="" name=sitesearch></INPUT>
<FONT color=#000000 size=-1>Web</FONT> </TD>
<TD><INPUT type=radio CHECKED value=xxlinux.com
name=sitesearch></INPUT> <FONT color=#000000
size=-1>xxlinux.com</FONT> </TD></TR></TBODY></TABLE><INPUT
type=hidden value=pub-3701573918329010 name=client></INPUT>
<INPUT type=hidden value=1 name=forid></INPUT> <INPUT
type=hidden value=GB2312 name=ie></INPUT> <INPUT type=hidden
value=GB2312 name=oe></INPUT> <INPUT type=hidden
value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1;
name=cof></INPUT> <INPUT type=hidden value=zh-CN
name=hl></INPUT> </TD></TR></TBODY></TABLE></FORM><!-- SiteSearch Google --></TD></TR>
<TR>
<TD>
<SCRIPT type=text/javascript><!--
google_ad_client = "pub-3701573918329010";
//468x60, 创建于 07-11-18
google_ad_slot = "8355102556";
google_ad_width = 468;
google_ad_height = 60;
//--></SCRIPT>
<SCRIPT src="如何编写Linux下的客户机-服务器软件-xxlinux_com.files/show_ads.js"
type=text/javascript>
</SCRIPT>
</TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD class=title_td><FONT
size=3><STRONG>如何编写Linux下的客户机/服务器软件</STRONG></FONT></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD height=6></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD align=middle>
<TABLE cellSpacing=0 cellPadding=0 width=548 border=0>
<TBODY>
<TR>
<TD align=middle colSpan=4>
<DIV align=center>[ 作者:dexin 加入时间:2006-10-16
12:15:46 来自:Linux联盟收集
]</DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=548 border=0>
<TBODY>
<TR>
<TD background=如何编写Linux下的客户机-服务器软件-xxlinux_com.files/title_line.gif
height=3></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=548 border=0>
<TBODY>
<TR>
<TD align=left>
<SCRIPT type=text/javascript><!--
google_ad_client = "pub-3701573918329010";
//336x280, 红色明显 07-11-18
google_ad_slot = "8859283166";
google_ad_width = 336;
google_ad_height = 280;
//--></SCRIPT>
<SCRIPT src="如何编写Linux下的客户机-服务器软件-xxlinux_com.files/show_ads.js"
type=text/javascript>
</SCRIPT>
</TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=548 border=0>
<TBODY>
<TR>
<TD width=8></TD>
<TD><FONT class=f14 id=zoom><FONT color=#000000><FONT
color=#333333>Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛。很久以来它就是Windows的重要对手之一。随着网络时代的来临,Linux的这种优势已变得更加突出。本文将论述如何在Linux环境下利用Socket实现客户机/服务器通信。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>随着网络技术的发展,网络结构已从过去的主机/终端型、对等型发展到现在广为使用的客户机/服务器型。客户机/服务器模型应用十分广泛,在Internet上WWW,E-mail,FTP等都是基于这种模型的。在面向连接的通信模式下,服务器打开监听端口,监听网络上其它客户机向该服务器发出的连接请求,当收到一个请求信号时与该客户机建立一个连接,之后两者进行交互式的通信。具体步骤可这样组织:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>服务器:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>1.打开一个已知的监听端口,如smtp为25、pop3为110、ftp为21、telnet为23等。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>2.在监听端口上监听客户机的连接请求,如果有客户机请求连接则建立一个连接线路。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>3.在连接线路上与客户机通信。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>4.通信完毕后关闭连接线路并继续监听客户机的连接请求。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>客户机:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>1.向指定的服务器主机及端口发出连接请求。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>2.当服务器建立连接线路后与服务器进行通信。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>3.通信完毕后关闭连接线路。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>Linux的许多特性都非常有助于网络程序设计:首先Linux拥有POSIX.1标准库函数,socket()、bind()、listen()这几个库函数可以非常方便地实现服务器/客户机模型,有关这几个库函数的使用说明将在后边介绍。其次Linux的进程管理也非常符合服务器的工作原理,所谓进程就是程序在内存中运行时的状态,可以说进程是动态的程序。在运行着Linux操作系统的计算机中,每一个进程都有一个创建它的父进程,而且它也能创建多个子进程。在服务器端我们可以用父进程去监听客户机的连接请求,当有客户机的连接请求时父进程创建一个子进程去建立连接线路并与客户机通信,而它本身可继续监听其它客户机的连接请求,这样就可避免当有一个客户机与服务器建立连接后服务器就不能再与其它客户机通信的问题。Linux的另一个特性是它秉承了UNIX设备无关性这一优秀特征,即它通过文件描述符实现了统一的设备接口,磁盘、显示终端、音频设备、打印设备甚至网络通信都使用统一的I/O调用。这三个特性将使Linux下的网络程序设计变得易如反掌。上述三个特性的综合利用将是这篇文章所要讲述的真谛所在。下边的客户机/服务器实现过程可以说明一二,注意与上文所述步骤的不同。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>服务器:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>1.打开一个已知的监听端口。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>2.在监听端口上监听客户机的连接请求,当有一客户机请求连接时建立连接线路并返回通信文件描述符。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>4.父进程创建一子进程,父进程关闭通信文件描述符并继续监听端口上的客户机连接请求。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>3.子进程通过通信文件描述符与客户机进行通信,通信结束后终止子进程并关闭通信文件描述符。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>客户机:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>1.向指定的服务器主机及端口发出连接请求,请求成功将返回通信文件描述符。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>2.通过通信文件描述符与服务器进行通信。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>3.通信完毕后关闭通信文件描述符。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>Linux的以下几个库函数是网络程序设计的核心部分,它们分别是:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>(1)socket<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>调用方式:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>#include <SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>#include <SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>int socket(int domain,int
type,int protocol);<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>简要说明:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>此函数为通信创建一个端口,正常调用将返回一个文件描述符,错误调用将返回-1。domain参数有两种选择:AF_UNIX与AF_INET,其中AF_INET为Internet通信协议。type参数也有两种选择:SOCK_STREAM用于TCP,SOCK_DGRAM用于UDP。protocol参数通常为0。可通过下列代码为基于TCP协议的Internet通信建立套接口传输端口:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>#include <SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>#include <SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>#include <SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>int sock;<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>if((sock=socket(AF_INET,SOCK_STREAM,0))==-1)<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>perror("Could not create
socket");<SPAN style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>(2)bind<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>调用方式:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>#include <SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>#include <SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>int bind(int s,const
struct sockaddr *address,size_t address_len);<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR><SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>简要说明:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>bind英文含意是关联,捆绑。其目的就是把socket返回的套接口端口与网络上的物理位置相关联。<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>bind正常调用返回0,出错返回-1。此函数有三个参数:其中s为socket调用返回的文件描述符,*address设置了与网络上的物理位置相关的信息,它的类型是struct
sockaddr,但在Internet上它是struct sockaddr_in。在socket.h中struct
sockaddr_in定义为:<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>struct sockaddr_in{<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>short sin_family;<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>u_short sin_port;<SPAN
style="DISPLAY: none">it6Linux联盟</SPAN><BR>struct in_addr
sin_addr;<SPAN style="DISPLAY: none">it6Linux联盟</SPAN><BR>char
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -