没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1 / 66
介绍
Socket 编程让你沮丧吗?从man pages中很难得到有用的信
息吗?你想跟上时代去编Internet相关的程序,但是为你在调用
connect() 前的bind() 的结构而不知所措?等等…
好在我已经将这些事完成了,我将和所有人共享我的知识了。
如果你了解 C 语言并想穿过网络编程的沼泽,那么你来对地方
了。---------------------------------------------
-----------------------------------
读者对象
这个文档是一个指南,而不是参考书。如果你刚开始 socket
编程并想找一本入门书,那么你是我的读者。但这不是一本完全
的 socket 编程书。
-------------------------------------------------------
-------------------------
平台和编译器
这篇文档中的大多数代码都在 Linux 平台PC 上用 GN
U 的 gcc 成功编译过。而且它们在 HPUX平台 上用 g
cc 也成功编译过。但是注意,并不是每个代码片段都独立测试过。
--------------------------------------------------
------------------------------
目录:
1) 什么是套接字?
2 / 66
2) Internet 套接字的两种类型
3) 网络理论
4) 结构体
5) 本机转换
6) IP 地址和如何处理它们
7) socket()函数
8) bind()函数
9) connect()函数
10) listen()函数
11) accept()函数
12) send()和recv()函数
13) sendto()和recvfrom()函数
14) close()和shutdown()函数
15) getpeername()函数
16) gethostname()函数
17) 域名服务(DNS)
18) 客户-服务器背景知识
19) 简单的服务器
20) 简单的客户端
21) 数据报套接字Socket
22) 阻塞
23) select()--多路同步I/O
3 / 66
24) 参考资料
------------------------------------------------
--------------------------------
什么是 socket?
你经常听到人们谈论着 “socket”,或许你还不知道它的确切
含义。现在让我告诉你:它是使用 标准Unix 文件描述符 ()
和其它程序通讯的方式。什么?你也许听到一些Unix高手(hacker)
这样说过:“呀,Unix中的一切就是文件!”那个家伙也许正在说到
一个事实:Unix 程序在执行任何形式的 I/O 的时候,程序
是在读或者写一个文件描述符。一个文件描述符只是一个和打开
的文件相关联的整数。但是(注意后面的话),这个文件可能是一
个网络连接,FIFO,管道,终端,磁盘上的文件或者什么其它的东西。
Unix 中所有的东西就是文件!所以,你想和Internet上别的
程序通讯的时候,你将要使用到文件描述符。你必须理解刚才的
话。现在你脑海中或许冒出这样的念头:“那么我从哪里得到网
络通讯的文件描述符呢?”,这个问题无论如何我都要回答:你利
用系统调用 socket(),它返回套接字描述符 (socket descr
iptor),然后你再通过它来进行send() 和 recv()调用。“但
是...”,你可能有很大的疑惑,“如果它是个文件描述符,那么为什
么不用一般调用read()和write()来进行套接字通讯?”简单
的答案是:“你可以使用!”。详细的答案是:“你可以,但是使用sen
d()和recv()让你更好的控制数据传输。”存在这样一个情
4 / 66
况:在我们的世界上,有很多种套接字。有DARPA Internet
地址 (Internet 套接字),本地节点的路径名 (Unix套接
字),CCITT X.25地址 (你可以将X.25 套接字完全忽略)。也
许在你的Unix 机器上还有其它的。我们在这里只讲第一种:I
nternet 套接字。
-----------------------------------------------------
---------------------------
Internet 套接字的两种类型
什么意思?有两种类型的Internet 套接字?是的。不,我
在撒谎。其实还有很多,但是我可不想吓着你。我们这里只讲两
种。除了这些, 我打算另外介绍的 "Raw Sockets" 也是非常强
大的,很值得查阅。
那么这两种类型是什么呢?一种是"Stream Sockets"(流格式),
另外一种是"Datagram Sockets"(数据包格式)。我们以后
谈到它们的时候也会用到 "SOCK_STREAM" 和 "SOCK
_DGRAM"。数据报套接字有时也叫“无连接套接字”(如果你
确实要连接的时候可以用connect()。) 流式套接字是可靠的
双向通讯的数据流。如果你向套接字按顺序输出“1,2”,那么它们
将按顺序“1,2”到达另一边。它们是无错误的传递的,有自己的错
误控制,在此不讨论。
有什么在使用流式套接字?你可能听说过 telnet,不是吗?
它就使用流式套接字。你需要你所输入的字符按顺序到达,不是
5 / 66
吗?同样,WWW浏览器使用的 HTTP 协议也使用它们来下载
页面。实际上,当你通过端口80 telnet 到一个 WWW 站
点,然后输入 “GET pagename” 的时候,你也可以得到
HTML 的内容。为什么流式套接字可以达到高质量的数据传输?
这是因为它使用了“传输控制协议 (The Transmission Co
ntrol Protocol)”,也叫 “TCP” (请参考 RFC-793 获得
详细资料。)TCP 控制你的数据按顺序到达并且没有错
误。你也许听到 “TCP” 是因为听到过 “TCP/IP”。这里的 IP
是指“Internet 协议”(请参考 RFC-791。) IP 只是处理 I
nternet 路由而已。
那么数据报套接字呢?为什么它叫无连接呢?为什么它是不可
靠的呢?有这样的一些事实:如果你发送一个数据报,它可能会
到达,它可能次序颠倒了。如果它到达,那么在这个包的内部是
无错误的。数据报也使用 IP 作路由,但是它不使用 TCP。
它使用“用户数据报协议 (User Datagram Protocol)”,
也叫 “UDP” (请参考 RFC-768。)
为什么它们是无连接的呢?主要是因为它并不象流式套接字
那样维持一个连接。你只要建立一个包,构造一个有目标信息的
IP 头,然后发出去。无需连接。它们通常使用于传输包-包信
息。简单的应用程序有:tftp, bootp等等。
你也许会想:“假如数据丢失了这些程序如何正常工作?”我的朋
友,每个程序在 UDP 上有自己的协议。例如,tftp 协议每发出
剩余65页未读,继续阅读
资源评论
omygodvv
- 粉丝: 503
- 资源: 1801
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功