Socket套接字-----最流行的网络通信程序接口之一

        套接字(Socket)起初来源于UNIX,是加利福尼亚大学Berkeley分校开发的UNIX操作系统下的网络通信接口。随着UNIX操作系统的广泛使用,Socket亦当之无愧的成为了最流行的网络通信程序接口之一。

       套接字是网络通信的基本构件,提供了不同主机间进程双向通信的端点,如同电话,只有当一方拨通另一方时,双方方能建立对话,而套接字正好比双方的电话。通过Sockets编程,程序可以跳过复杂的网络底层协议和结构,直接编制与平台无关的应用程序。随着Internet的广泛应用,Sockets已逐渐成为网络编程的通用接口。

套接字(Socket)

         一个完整的网络应用程序包括客户端和服务器两个部分。网间通信进程需要由两个进程组成,并且只能用同一种协议。也就是说,不能在通信的一端使用TCP协议,而另一端则用UDP协议。一个完整的网络通信需要一个五元组来标识:协议(如TCP、UDP协议等)本地地址(即本机IP地址)本地端口号(本机中当前线程分配的端口号)远端地址(目的计算机的IP地址)远端端口号(目的计算机中对应的线程端口号)

          应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP,UDP协议交互提供了称为套接字(socket)的接口。套接字是一个通信终结点,它是Sockets应用程序用来在网络上发送或接收数据包的对象。套接字具有类型,与正在运行的进程相关联,并且可以有名称。使用套接字的应用程序间通信模型如图所示。


        在网络上,一个套接字由一个IP地址和一个端口号唯一确定。套接字的地址指该套接字所在计算机的网络地址,可以为域名或IP地址的形式。同一计算机上可以运行多个网络应用程序,每个应用程序都有自己的套接字用以进行网络通信,此时如果只有地址标识套接字,则当一个通信包到达计算机时,将无法确定究竟是哪个应用程序的套接字需要接收此信息。由此增加了端口的概念,以协助区分同一计算机上不同应用程序的套接字。端口用于标识进程,同一计算机上不同的网络应用程序各有不同的端口,这样,通过“网络地址+端口号”的标识方法,便唯一标识了计算机上的应用程序了。某些端口是专门为公共服务保留的,如FtP:21,httP:80,除非程序是要提供这些服务,否则应避免使用这些端口。一般来说,端口1024以前的端口号都是系统保留的或是作为公共服务的,应尽量选择大于1024的端口号,以避免冲突。套接字一般分为三种类型:

1.流式套接字(SOCK--STREAM):

        该类套接字提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务。而且发送的数据是按顺序接收的。所有利用该套接字进行传递的数据均被视为连续的字节流的并且无长度限制。这对数据的稳定性、正确性和发送/接受顺序要求严格的应用十分适用,TCP使用该类接口。

2.数据报式套接字(SOCK--DGRAM):

        数据报式套接字提供了面向无连接的服务,不提供正确性检查,也不保证各数据包的发送顺序,因此,可能出现数据的重发、丢失等现象,并且接收顺序由具体路由决定。然而,与流式套接字相比,使用数据报式套接字对网络线路占用率较低。在TCP月P协议组中,UDP使用该类套接字。

3.原始套接字(SOCK--RAW):

        该套接字一般不会出现在高级网络接口的现中,因为它是直接针对协议的较低层(如IP、TCP、UDP等)直接访问的。用于检验新的协议实现或访问现有服务中配置的新设备,使用原始套接字存在络应用程序的兼容性问题,所以一般不推荐使用原始套接字。

标准的套接字函数

accept() Accept a connection on a socket
bind() Bind a name to a socket
connect() Initiate a connection on a socket
getpeername() Return name (address) of connected peer
getsockname() Return the local name (address) of the socket
getsockopt() Get the value of a socket option
listen() Listen for connection requests on a socket
recv() Receive data from a socket
recvfrom() Receive data from a socket with the senders name (address)
send() Send data to a connected socket
sendto() Send data to a specified destination on an unconnected socket
setsockopt() Set the value of a socket option
shutdown() Close one half of a socket connection
socket() Create a socket
socketpair() Create socket pair 

增强的套接字函数

recvnc() Receive no-copy data from a socket
recvncfree() Free buffer obtained from recvnc() or recvncfrom()
recvncfrom() Receive no-copy data from a socket with the senders name (address)














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_IRONMAN_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值