套接字是用来进行主机间通讯的,linux的socket和windows差不多,虽然有一定的区别,但是其基本原理与结构是一样的,因此,一台windows的主机可以和一台linux的主机通过套接字进行通讯。socket采用客户端与服务器端的模式使两台主机进行通讯。首先,服务器端调用函数socket新建一个套接字,该套接字只能由该进程所有。然后服务器段进程对socket进行命名,本地套接字将被赋予一个文件名,该文件通常保存在/tmp或者/usr/tmp下。对于网络套接字,名字将是一个与所连接的网络有关的能够被客户端连接上的端口号。套接字命名的函数是bind。然后服务器段调用函数listen来等待客户端的连接,并对进入的连接组成一个队列。服务器端调用函数accept接受连接。
当连接被接受后,将新建一个套接字来进行与该客户端的通讯,而原来的套接字将保留以供进行和其它客户端的连接。
客户端的socket连接更加直接,首先新建一个未命名的套接字,然后调用函数connect来对已经具有命名套接字的服务器端进行连接。
套接字的性质主要分为三方面:域,类型和协议。
域指定了socket通讯使用的网络媒介,最常用的socket域是代表互联网络的AF_INET,在该域下使用的协议是IP。AF_UNIX域适用于单独的一台计算机上的socket通讯,这种情况下使用的协议是文件输入/输出。还有AF_ISO和AF_XNS两种域分别对应于ISO标准网络和Xerox网络系统。
套接字的类型包括:流和数据报。流类型的套接字与文件流类似,数据以连续的形式在两个主机之间进行传送。而数据报类型的套接字则对传送的数据的大小有限制。
协议则与其所在的域有关。
下面的例子演示了一个能够接受多个客户端的服务器程序,通过调用函数fork在主进程中复制一个子进程,将与特定客户端通讯的任务交给子进程,主进程仍然能够接受新的客户端的连接:
1.首先引用必要的头文件和定义必要的变量
2.创建客户端序列,忽略子进程的结束信息,等待客户端连接
3.接受连接
4.创建子进程,判断当前进程是否为子进程
5.如果是子进程,则与客户端进行通讯
6.否则,该客户端的工作已经完成,可以关闭与该客户端的连接