基于tcpip上的socket编程接口技术及应用内容摘要:
当于关闭 socket,撤消连接。 在电话系统中,一般用户只能感受到本地电话机和对方电话号码的存在,建立通话的过程,话音传输的过程以及整个电话系统的技术细节对他都是透明的,这也与 socket 机制非 常相似。 socket 利用网间网通信设施实现进程通信,但它对通信设施的细节毫不关心,只要通信设施能提供足够的通信能力,它就满足了。 至此,我们对 socket 进行了直观的描述。 抽象出来, socket 实质上提供了进程通信的端点。 进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。 正如打电话之前,双方必须各自拥有一台电话机一样。 在 网间 内部,每一个 socket 用一个半相关描述 :协议,本地地址,本地端口。 一个完整的 socket 有一个本地唯一的 socket 号,由操作系统分配。 最重要的是, socket 是面向客户 /服务器模型而设计的,针对客户和服务器程序提供不同的 socket 系统调用。 客户随机申请一个 socket (相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫 ),系统为之分配一个 socket 号;服务器拥有全局公认的 socket ,任何客户都可以向它发出连接请求和信息请求 (相当 10 于一个被呼叫的电话拥有一个呼叫方知道的电话号码 )。 socket 利用客户 /服务器模式巧妙地解决了进程之间建立通信连接的问题。 服务器 socket 半相关为全局所公认非常重要。 那么 两个完全随 机的用户进程之间如何建立通信。 假如通信双方没有任何一方的 socket 固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。 Socket 接口是访问 Inter 使用得最广泛的方法。 如果你有一台刚配好TCP/IP 协议的主机,其 IP 地址是 , 此时在另一台主机或同一台主机上执行 ftp ,显然无法建立连接。 因 这台主机没有运行 FTP 服务软件。 同样, 在另一台或同一台主机上运行浏览软件 如 Netscape,输入 主机上运行一个 FTP 服务软件(该软件将打开一个 Socket, 并将其绑定到 21端口),再在这台主机上运行一个 Web 服务软件(该软件将打开另一个 Socket,并将其绑定到 80 端口)。 这样,在另一台主机或同一台主机上执行 ftp , FTP 客户软件将通过 21 端口来呼叫主机上由 FTP 服务软件 提供的 Socket,与其建立连接并对话。 而在 scape 中输入 时,将通过 80 端口来呼叫主机上由 Web 服务软件提供的 Socket,与其建 立连接并对话。 在 Inter 上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。 每种服务都打开一个 Socket,并绑定到一个端口上,不同的端口对应于不同的服务。 Socket 正如其英文原意那 样,象一个多孔插座。 一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供 220 伏交流电, 有的提供 110 伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。 套接字 的概念 在网络编程中最常见的是客户 /服务器模式。 以该模式编程时 客户端在需要的时候,向服务端发出连接请求 ,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的数据交换方法和格式进行数据传输。 使用 socket 调用后,仅产生了一 个可以使用的 socket 描述符,这时还不能进行通信,还要使用其他的调用,以使得 11 socket 所指的结构中使用的信息被填写完。 在使用 TCP 协议时,一般服务端进程先使用 socket 调用得到一个描述符,然后使用 bind 调用将一个名字与 socket描述符连接起来,对于 Inter 域就是将 Inter 地址联编到 socket。 之后,服务端使用 listen 调用指出等待服务请求队列的长度。 然后就可以使用 accept 调用等待客户端发起连接(一般是阻塞等待连接,),一旦有客户端发出连接, accept 返回客户的地址信息,并 返回一个新的 socket 描述符,该描述符与原先的 socket有相同的特性,这时服务端就可以使用这个新的 socket 进行读写操作了。 一般服务端可能在 accept 返回后创建一个新的进程进行与客户的通信,父进程则再到accept 调用处等待另一个连接。 客户端进程一般先使用 socket 调用得到一个socket 描述符,然后使用 connect 向指定的服务器上的指定端口发起连接,一旦连接成功返回,就说明已经建立了与服务器的连接,这时就可以通过 socket 描述符进行读写操作了。 使用无连接的 UDP 协议时,服务端进程创建一个 socket,之后调用 recvfrom接收客户端的数据报,然后调用 sendto 将要返回客户端的消息发送给客户进程。 客户端也要先创建一个 socket,再使用 sendto 向服务端进程发出请求,使用recvfrom 得到返回的消息。 如何开发一个 ServerClient 模型的程序 服务器,使用 ServerSocket 监听指定的端口,端口可以随意指定(由于 1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于 1024 的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后 ,关闭连接。 客户端,使用 Socket 对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭 Socket。 客户端不需要指定打开的端口,通常临时的、动态的分配一个 1024 以上的端口 [10]。 Socket 接口是 TCP/IP 网络的 API, Socket 接口定义了许多函数或例程,程序员可以用它们来开发 TCP/IP 网络上的应用程序。 Socket 接口设计者最先是将接口放在 Unix 操作系统里面的。 如果了解 Unix 系统的输入和输出的话,就很容易了解 Socket 了。 网络的 Socket 数据传输是一种特殊的 I/O, Socket 也是一种文件描述符。 Socket 也具有一个类似于打开文件的函数调用 Socket(),该函数返回 12 一个整型的 Socket 描述符,随后的连接建立、数据传输等操作都是通过该 Socket实现的。 TCP/IP 的 socket 提供的套接字的类型。 常用的 Socket 类型有 三 种:流式 Socket( SOCK_STREAM) 、 原始式套接字( SOCK_RAW) 和数据报式 Socket( SOCK_DGRAM)。 流式是一种面向连接的 Socket,针对于面向连接的 TCP 服务应用;数 据报式 Socket 是一种无连接的 Socket,对应于无连接的 UDP 服务应用 ; 原始式套接字( SOCK_RAW)该接口允许对较低层协议,如 IP、 ICMP 直接访问。 常用于检验新的协议实现或访问现有服务中配置的新设备。 在网络编程中较多采用的是 面向连接的套接字 ,使用面向连接的协议 (TCP)。 调用时序图如图 所示。 13 图 面向连接协议的 套接字时序调用图 另外一种常见的套接字类型 无连接协议的套接字 ,其使用无连接的 UDP 服务应用。 如图 给出了 数据报式套接字时序调用图 图 无连接协议的 套接字时序调用图 基本套接字系统调用 为了建立 Socket,程序可以调用 Socket 函数,该函数返回一个类似于文件描述符的句柄。 socket 函数原型为: int socket(int domain, int type, int protocol);domain 指明所使用的协议族,通常为 PF_INET,表示互联网协议族( TCP/IP 协议族); type 参数指定 socket 的类型: SOCK_STREAM 、 SOCK_RAW 或SOCK_DGRAM, Socket 接口还定义了原始 Socket( SOCK_RAW),允许程序使用低层协议; protocol 通常赋值 0。 Socket()调用返回一个整型 socket 描述符,你可以在后面的调用使用它。 Socket 描述符是一个指向内部数据结构的指针,它指向描述符表入口。 调用 Socket 函数时, socket 执行体将建立一个 Socket,实际上 建立一个 Socket意味着为一个 Socket 数据结构分配存储空间。 Socket 执行体为你管理描述符表。 两个网络程序之间的一个网络连接包括五种信息:通 信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。 Socket数据结构中包含这五种信息。 创建套接字── socket() 应用程序在使用套接字前,首先必须拥有一个套接字,系统调用 socket()向应用程序提供创建套接字的手段,其调用格式如下: 14 SOCKET PASCAL FAR socket(int af, int type, int protocol)。 该调用要接收三个参数: af、 type、 protocol。 参数 af 指定通信发生的区域,UNIX 系统支持的地址族有: AF_UNIX、 AF_INET、 AF_NS 等,而 DOS、WINDOWS 中仅支持 AF_INET,它是网际网区域。 因此,地址族与协议族相同。 参数 type 描述要建立的套接字的类型。 参数 protocol 说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为 0,使用默认的连接模式。 根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。 因此, socket()系统调用 实际上指定了全相关五元组中的“协议”这一元。 指定本地地址── bind() 当一个套接字用 socket()创建后,存在一个名字空间 (地址族 ),但它没有被命名。 bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关。 其调用格式如下: int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen)。 参数 s 是由 socket()调用返回的并且未作连接的套接字描述符 (套接字号 )。 参数 name 是赋给套接字 s 的本地地址(名字),其长度可变,结构随通信域的不同而不同。 namelen 表明了 name 的长度。 如果没有错误发生, bind()返回 0。 否则返回值 SOCKET_ERROR。 bind() 在错误的时候依然是返回 1,并且设置全局错误变量 errno。 在你调用 bind() 的时候,你要小心的另一件事情是:不要采用小于 1024 的端口号。 所有小于 1024 的端口号都被系统保留。 你可以选择从 1024 到 65535 的端口 (如果它们没有被别的 程序使用的话 )。 你要注意的另外一件小事是;有时候你根本不需要调用它。 如果你使用connect()来和远程机器进行通讯,你不需要关心你的本地端口号 (就象你在使用 tel 的时候 ),你只要简单的调用 connect() 就可以了,它会检查套接字是否绑定端口,如果没有,它会自己绑定一个没有使用的本地端口。 建立套接字连接── connect()与 accept() 这两个系统调用用于完成一个完整相关的建立,其中 connect()用于建立连 15 接。 无连接的套接字进程也可以调用 connect(),但这时在进程之间没有实际的报文交换,调用将从本地操作系统直接返回。 这样做的优点是程序员不必为每一数据指定目的地址,而且如果收到的一个数据报,其目的端口未与任何套接字建立“连接” ,accept()用于使服务器等待来自某客户进程的实际连接。 connect()的调用格式如下: int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR * name, int namelen)。 参数 s 是欲建立连接的本地套接字描述符。 参数 name 指出说 明对方套接字地址结构的指针。 对方套接字地址长度由 namelen 说明。 如果没有错误发生,connect()返回 0。 否则返回值 SOCKET_ERROR。 在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。 由于地址族总被包含在套接字地址结构的前两个字节中,并通过 socket()调用与某个协议族相关。 因此 bind()和 connect()无须协议作为参数。 accept()的调用格式如下: SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen)。 参数 s 为本地套接字描述符,在用做 accept()调用的参数前应该先调用过listen()。 addr 指向客户方套接字地址结构的指针,用来接收连接实体的地址。 addr的确切格式由套接字创建时建立的地址族决定。 addrlen 为客户方。基于tcpip上的socket编程接口技术及应用
相关推荐
lin ( )方法读取网络缓冲区中数据,不管 是否读到数据都立即返回,而不会一直挂在此函数调用上。 在 Windows 网络通信软件开发中,最为常用的方法就是异步非阻塞套接字。 平常所说的 C/S(客户端 /服务器)结构的软件采用的方式就是异步非阻塞模式的。 其实在用 C#进行网络编程中,我们并不需要了解什么同步、异步、阻塞和非阻塞的原理和工作机制,因为在 .Net FrameWrok SDK
套接字也被称为 socket, socket 的英文原义是 “孔 ”或 “插座 ”。 在这里作为4BDS UNIX 的进程通信机制,取后一种意义。 socket 非常类似于电话插座。 以一个国家级电话网为例。 电话的通话双方相当于相互通信的 2 个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于 socket 号。 任何用户在通话之 前
y HT=0;若 e ≠ 0,则 y HT≠ 0。 因此, y HT 仅 与错误图样有关,而与发送的是哪一个 码字无关。 令 s = y HT= e HT,称为接受序列的伴随式或校正子。 在本文所讨论的 (8,2)线性分组码中,已知该码的校验矩阵为: (1) 若传送时发生 1 个错误: 设 =(00000000), e1=(1000000), 则 y1=(10000000), 计算得 s1=y1
究方法及相关研究手段(如计算机、实验仪器设备等)进行实验、实践并加工处理、总结信息。 10 外文应用 能力 能阅读 、翻译一定量的本专业外文资料、外文摘要和外文参考书目(特殊专业除外)体现一定的外语水平。 5 论文质量35% 文题相符 较好地完成论文选题的目的要求。 5 写作水平 论点鲜明;论据充分;条理清晰;语言流畅。 15 写作规范 符合学术论文的基本要求。 用语、格式、图表、数据、量
信道就是将信道分组分配给每个用户,这样可减轻由于各信道能量不均和频偏所造成的用户间干扰,但同时也容易造成信号产生衰落。 (2) 自适应调频 自适应调频是基于信道性能的调频技术。 由于在移动通信环境中,每个用户所处的位置不尽相同,它们收到的信号强度也不同于其他用户,所以信道衰落模式也不完全相同。 根据用户的信道特征来选择对其而言具有最佳信噪比的信号。 循环前缀 在 OFDM系统中
ASK ( t )( a ) 模拟调制法( 相乘器法 )cos c t开关电路s ( t )e 2 ASK ( t )( b ) 通 断键控 ( OOK , On Of f K e y i n g ) s ( t )二进制不归零信号e 2 ASK ( t )BPF全波整流器LPF抽样判决器 输出a b c d定时脉冲( a ) 非相干解调 ( 包络检波法 )e 2 ASK ( t )BPF