分享
 
 
 

网络工程师考试常用的socket程序

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

Hey! Socket 编程让你沮丧吗?从 man pages 中很难得到有用的信息吗?你想 跟上时代去做一做

Internet 程序,但是为你在调用 connect() 前的 bind() 的结构而愁眉不展?…

好了,我现在已经来了,我将和所有人共享我的知识了。如果你了解 C 语言并想穿过 网络编程的沼泽,那么你来对地方了。

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

读者

这个文档是写成一个指南,而不是参考书。如果你刚开始 socket 编程并想找一本

入门书,那么你是我的读者。这可不是一本完全的 socket 编程书。

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

平台和编译器

这篇文章中的大多数代码都在一台 Linux PC 上用 GNU 的 gcc 成功编译过。 而且他们在一台 HPUX 上用

gcc 也成功编译过。但是注意,并不是每个代码 片段都独立测试过。

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

目录:

什么是套接口?

Internet 套接口的两种类型

网络理论

struct--要么了解他们,要么等异形入侵地球

Convert the Natives!

IP 地址和如何处理他们

socket()--得到文件描述符!

bind()--我们在哪个端口?

connect()--Hello!

listen()--有人给我打电话吗?

accept()--"Thank you for calling port 3490."

send() 和 recv()--Talk to me, baby!

sendto() 和 recvfrom()--Talk to me, DGRAM-style

close() 和 shutdown()--滚开!

getpeername()--你是谁?

gethostname()--我是谁?

DNS--你说“白宫”,我说 "198.137.240.100"

客户-服务器背景知识

简单的服务器

简单的客户端

数据报 Socket

阻塞

select()--多路同步 I/O,酷!

参考资料

Disclaimer and Call for Help

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

什么是 socket?

你始终听到人们谈论着 "socket",而你不知道他的确切含义。那么,现在我告诉你: 他是使用 Unix 文件描述符

(fiel descriptor) 和其他程序通讯的方式。

什么?

Ok--你也许听到一些 Unix 高手 (hacker) 这样说:“呀,Unix 中所有的东西

就是文件!”那个家伙也许正在说到一个事实:Unix 程序在执行任何形式的 I/O 的时候,

程序是在读或者写一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数。

但是(注意后面的话),这个文件可能是一个网络连接,FIFO,管道,终端,磁盘上的文件 或者什么其他的东西。Unix

中所有的东西是文件!因此,你想和 Internet 上别 的程序通讯的时候,你将要通过文件描述符。最好相信刚才的话。

现在你脑海中或许冒出这样的念头:“那么我从哪里得到网络通讯的文件描述符呢,聪明

人?”无论如何,我要回答这个问题:你利用系统调用 socket()。他返回套接口描 述符 (socket

descriptor),然后你再通过他来调用 send() 和 recv()。

“但是...”,你可能现在叫起来,“如果他是个文件描述符,那么为什么不用一般的调用 read() 和 write()

来通过套接口通讯?”简单的答案是:“你可以使用 一般的函数!”。详细的答案是:“你可以,但是使用 send() 和

recv() 让你更好的控制数据传输。”

有这样一个事实:在我们的世界上,有很多种套接口。有 DARPA Internet 地址 (Internet

套接口),本地节点的路径名 (Unix 套接口),CCITT X.25 地址 (你可以完全忽略 X.25 套接口)。

也许在你的 Unix 机器上还有其他的。我们在这里只讲第一种:Internet 套接口。

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

Internet 套接口的两种类型

什么意思?有两种 Internet 套接口?是的。不,我在撒谎。其实还有很多,但是我可不想 吓着你。我们这里只讲两种。

Except for this sentence, where I'm going to tell you that

"Raw Sockets" are also very powerful and you should look them

up.

好了,好了。那两种类型是什么呢?一种是 "Stream Sockets",另外一种是 "Datagram

Sockets"。我们以后谈到他们的时候也会用到 "SOCK_STREAM" 和 "SOCK_DGRAM"。

数据报套接口有时也叫“无连接套接口”(如果你确实要连接的时候用 connect()。)

流式套接口是可靠的双向通讯的数据流。如果你向套接口安顺序输出“1,2”,那么他们

将安顺序“1,2”到达另一边。他们也是无错误的传递的,有自己的错误控制。

有谁在使用流式套接口?你可能听说过 telnet,不是吗?他就使用流式套接口。你需要你所输入的字符按顺序到达,不是

吗?同样,WWW 浏览器使用的 HTTP 协议也使用他们。实际上,当你通过端口80 telnet 到一个 WWW

站点,然后输入 “GET pagename” 的时候,你也可以得到 HTML 的内容。

为什么流式套接口可以达到高质量的数据传输?他使用了“传输控制协议 (The Transmission ControlProtocol)”,也叫 “TCP” (请参考 RFC-793 获得详细资料。)TCP 控制你的数据

按顺序到达并且没有错误。你也许听到 “TCP” 是因为听到过 “TCP/IP”。这里的 IP 是指 “Internet

协议”(请参考 RFC-791.) IP 只是处理 Internet 路由而已。

那么数据报套接口呢?为什么他叫无连接呢?为什么他是不可靠的呢?恩,有这样的事实:如果你发送一个数据报,他可能到达,他可能次序颠倒了。如果他到达,那么在这个包的内部是无错误的。

数据报也使用 IP 作路由,但是他不选择 TCP。他使用“用户数据报协议 (User Datagram

Protocol)”,也叫 “UDP” (请参考 RFC-768.)

为什么他们是无连接的呢?主要原因是因为他并不象流式套接口那样维持一个连接。 你只要建立一个包,在目标信息中构造一个 IP

头,然后发出去。不需要连接。应用程序有: tftp, bootp 等等。

“够了!”你也许会想,“如果数据丢失了这些程序如何正常工作?”我的朋友,每个程序在 UDP 上有自己的协议。例如,tftp

协议每发出一个包,收到者发回一个包来说“我收到了!” (一个“命令正确应答”也叫“ACK”

包)。如果在一定时间内(例如5秒),发送方没有收到应答, 他将重新发送,直到得到 ACK。这一点在实现 SOCK_DGRAM

应用程序的时候非常重要。

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

网络理论

既然我刚才提到了协议层,那么现在是讨论网络究竟如何工作和演示 SOCK_DGRAM

的工作。当然,你也可以跳过这一段,如果你认为 已经熟悉的话。

朋友们,现在是学习 数据封装 (Data Encapsulation) 的时候了! 这非常非常重要。It's so

important that you might just learn about it if you take the

networks course here at Chico State ;-).

主要的内容是:一个包,先是被第一个协议(在这里是 TFTP )包装(“封装”), 然后,整个数据(包括 TFTP

头)被另外一个协议(在这里是 UDP )封装,然后下 一个( IP ),一直重复下去,直到硬件(物理)层( Ethernet

)。

当另外一台机器接收到包,硬件先剥去 Ethernet 头,内核剥去 IP 和 UDP 头,TFTP 程序再剥去 TFTP

头,最后得到数据。

现在我们终于讲到臭名远播的 网络分层模型 (Layered Network Model)。

这种网络模型在描述网络系统上相对其他模型有很多优点。例如,你可以写一个套接口

程序而不用关心数据的物理传输(串行口,以太网,连接单元接口 (AUI) 还是其他介质。

因为底层的程序为你处理他们。实际的网络硬件和拓扑对于程序员来说是透明的。

不说其他废话了,我现在列出整个层次模型。如果你要参加网络考试,可一定要记住:

应用层 (Application)

表示层 (Presentation)

会话层 (Session)

传输层 (Transport)

网络层 (Network)

数据链路层 (Data Link)

物理层 (Physical)

物理层是硬件(串口,以太网等等)。应用层是和硬件层相隔最远的--他是用户和网络 交互的地方。

这个模型如此通用,如果你想,你可以把他作为修车指南。把他应用到 Unix,结果是:

应用层 (Application Layer) (telnet, ftp, 等等)

传输层 (Host-to-Host Transport Layer) (TCP, UDP)

Internet 层 (Internet Layer) (IP 和路由)

网络访问层 (Network Access Layer) (网络层,数据链路层和物理层)

现在,你可能看到这些层次如何协调来封装原始的数据了。

看看建立一个简单的数据包有多少工作?哎呀,你将不得不使用 "cat" 来完成 他们!简直是笑话。对于流式套接口你要作的是

send() 发送数据。对于数据报 式套接口你按照你选择的方式封装数据然后用 sendto()。内核将为你建立传输 层和

Internet 层,硬件完成网络访问层。这就是现代科技。

现在结束我们的网络理论速成班。哦,忘记告诉你关于路由的事情了。但是我不准备谈他。 如果你真的想知道,那么参考 IP

RFC。如果你从来不曾了解他,也没有 关系,你还活着不是吗。

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

structs

终于到达这里了,

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有