欢迎来到天天文库
浏览记录
ID:22682667
大小:200.00 KB
页数:37页
时间:2018-10-30
《socket编程知识必学》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Socket编程知识必学来源:ChinaUnix博客 日期:2008.06.2923:42 (共有条评论)我要评论/***Author:cnscn*HOME:http://www.cnscn.org*整理自《Linux网络编程》*/端口号常识:端口号被从1开始分配。通常端口号超出255的部分被本地主机保留为私有用途。1到255之间的号码被用于远程应用程序所请求的进程和网络服务。每个网络通信循环地进出主计算机的TCP应用层。它被两个所连接的号码唯一地识别。这两个号码合起来叫做套接字.组成套接字的这两个号码就是机器的IP地址和TCP软件所使用的端口号。套接字的三种类型流式套接字(SOCK
2、_STREAM),数据报套接字(SOCK_DGRAM)及原始套接字(RAW)。流式套接字(SOCK_STREAM)流式的套接字可以提供可靠的、面向连接的通讯流。如果你通过流式套接字发送了顺序的数据:“1”、“2”。那么数据到达远程时候的顺序也是“1”、“2”。Telnet应用程序、BBS服务、以及系统的远程登陆都是通过Telnet协议连接的。Telnet就是一个流式连接。你是否希望你在Telnet应用程序上输入的字符(或汉字)在到达远程应用程序的时候是以你输入的顺序到达的?答案应该是肯定的吧。还有WWW浏览器,它使用的HTTP协议也是通过流式套接字来获取网页的。事实上,如果你Teln
3、et到一个WebSite的80端口上,然后输入“GET网页路径名”然后按两下回车(或者是两下Ctrl+回车)然后你就得到了“网页路径名”所代表的网页!数据报套接字(SOCK_DGRAM)数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。如果你发送了一个数据报,它可能不会到达。它可能会以不同的顺序到达。如果它到达了,它包含的数据中可能存在错误。数据报套接字也使用IP,但是它不使用TCP,它使用使用者数据报协议UDP(UserDatagramProtocol可以参考RFC768)为什么说它们是“无连接”的呢?因为它(UDP)不像流式套接
4、字那样维护一个打开的连接,你只需要把数据打成一个包,把远程的IP贴上去,然后把这个包发送出去。这个过程是不需要建立连接的。UDP的应用例子有:tftp,bootp等。那么,数据包既然会丢失,怎样能保证程序能够正常工作呢?事实上,每个使用UDP的程序都要有自己的对数据进行确认的协议。比如,TFTP协议定义了对于每一个发送出去的数据包,远程在接受到之后都要回送一个数据包告诉本地程序:“我已经拿到了!”(一个“ACK”包)。如果数据包发的送者在5秒内没有的得到回应,它就会重新发送这个数据包直到数据包接受者回送了“ACK”信号。这些知识对编写一个使用UDP协议的程序员来说是非常必要的。无连接
5、服务器一般都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互作用。面向连接服务器处理的请求往往比较复杂,不是一来一去的请求应答所能解决的,而且往往是并发服务器套接字工作过程如下:服务器首先启动通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接字然后就可调用connect()和服务器建立连接。客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,双方
6、调用close()关闭套接字。对流式套接字你所需要做的只是调用send()函数来发送数据。而对于数据报套接字,你需要自己加个信息头,然后调用sendto()函数把数据发送出去原始套接字原始套接字主要用于一些协议的开发,可以进行比较底层的操作。它功能强大,但是没有上面介绍的两种套接字使用方便,一般的程序也涉及不到原始套接字套接字结构structsockaddr这个结构用来存储套接字地址。数据定义:structsockaddr{unsignedshortsa_family;/*address族,AF_xxx*/charsa_data[14];/*14bytes的协议地址*/};sa_fa
7、mily一般来说,都是“AF_INET”。sa_data包含了一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂溶在一切的。为了处理structsockaddr,程序员建立了另外一个相似的结构structsockaddr_in(“in”代表“Internet”):structsockaddr_in{shortintsin_family;/*Internet地址族*/unsignedshortintsin_port;/*端口号*/structin_ad
此文档下载收益归作者所有