Linux socket- 编程入门 (TCP server 端 )
通常,socket 编程总是 Client/Server 形式的,因为有了 telnet,先不考虑 client 的程序,
先写一个支持 TCP 协议的 server 端,然后用 telnet 作为 client 验证我们的程序。
TCP server 端的基本流程*
想象你自己是个小大佬,坐办公室(什么样的黑社会做办公室啊?可能是讨债公司吧^
^)你很土,只有一个小弟帮你接电话(因为你自己的号码是不敢对外公开的)。一次通讯的
流程大概应该是这样的:小弟那里的总机电话响了;小弟接起电话;对方说是你女朋友 A 妹;
小弟转达说,“老大,你马子电话”;你说,接过来;小弟把电话接给你;你和你女朋友聊天半
小时;挂电话。*
分析一下整个过程中的元素。你小弟(listenSock),你需要他来监听(listen)电话;
你自己(communicationSock),实际上打电话进行交流的是你自己;你的电话号码
(servAddr),否则你女朋友怎么能找到你?你女朋友的电话号码(clntAddr),这个比喻
有点牵强,因为事实上你接起电话,不需要知道对方的号码也可以通话(虽然事实上你应该是
知道的,你不会取消了来电显示功能吧^^),但是,难道你是只接女朋友电话从来不打过去
的牛人吗?这个过程中的行为(成员函数):你小弟接电话并转接给你(isAccept());你自
己的通话(handleEcho())(这个行为确实比较土,只会乌鸦学舌的 echo,呵呵)。
UNIX 中的一切事物都是文件(everything in Unix is a le!)
这是 UNIX 的基本理念之一,也是一句很好的概括。比如,很多 UNIX 老鸟会举出个例子
来,“你看,/dev/hdc 是个文件,它实际上也是我的光盘……”UNIX 中的文件可以是:网络连
接(network connection),输入输出(FIFO),管道(a pipe),终端(terminal),硬
盘上的实际文件,或者其它任何东东。
3 个已经打开的 fd,0:标准输入(STDIN_FILENO);1:标准输出
(STDOUT_FILENO);2:标准错误(STDERR_FILENO)。(以上宏定义在<unistd.h>
中)一个最简单的使用 fd 的例子,就是使用<unistd.h>中的函数:write(1, "Hello,
World!", 20);,在标准输出上显示“Hello, World!”。
le 和 fd 并非一定是一一对应的。当一个 9le 被多个程序调用的时候,会生成相互独立的
fd。这个概念可以类比于 C++中的引用(eg: int& rTmp = tmp;)。
socket 与 9le descriptor
文件是应用程序与系统(包括特定硬件设备)之间的桥梁,而文件描述符就是应用程序
使用这个“桥梁”的接口。在需要的时候,应用程序会向系统申请一个文件,然后将文件的描述
符返回供程序使用。返回 socket 的文件通常被创建在/tmp 或者/usr/tmp 中。我们实际上不
用关心这些文件,仅仅能够利用返回的 socket 描述符就可以了。*
收件人:全体女生。*
地址:<一种地址描述方式>
事实上,在 socket 的通用 address 描述结构 sockaddr 中, 正是用这样的方式来进行地
址描述的:
structsockaddr
{