平时你可能都听说,“用socket通信,用socket建立连接”等等说法,这些说法可能让你很迷茫,没有用管道建立连接让你闻其名便知其意,我也是,所以我查了一下,记录下来。
进程间通信的手段有好多种,管道,信号,报文,共享内存都是进程间通信的手段,
socket通信也是一种进程间通信的手段,他的特点是不光能让一个主机上进程互相通信,还可以让不同主机上的进程进行通信。而前几个都是基于Sys V的IPC机制,只能让同一个主机上不同进程进行通信。
建立一个socket也就是建立一个类似于管道,有两个端口。两个主机(或者同一个主机)的两个不同进程分别绑定这两个端口,都可以发送和接受消息,这样就建立了一个socket通信。
下面看看如何真正的创建一个socket通信
1/创建套接口,由系统调用socket实现
int socket( int domain, int type, int ptotocol);
参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),PF_INET6(IPv6)等
type指明通信类型,如SOCK_STREAM(面向连接方式)、SOCK_DGRAM(非面向连接方式)等
参数protocol可设置为0,除非用在原始套接口上。
然后可能有人要问,这个函数是在客户端(发送消息)还是在服务器端(接受消息)调用啊?你说呢?
当然是客户端和服务器端都要创建啊。
2/绑定地址int bind( int sockfd, const struct sockaddr * my_addr, socklen_t my_addr_len)
客户端和服务器端都要把自己的ip地址(根据地址寻找到主机)和端口号(根据端口号寻找进程,也就是
那个提供特定服务的进程)绑定在套接口的两端。
3/请求建立连接
int connect( int sockfd, const struct sockaddr * servaddr, socklen_t addrlen)
这个函数是由客户端发起的。
第一个参数为本地调用socket后返回的描述符
第二个参数为服务器的地址结构指针。connect()向指定的套接口请求建立连接
4/接受连接请求
int accept( int sockfd, struct sockaddr * cliaddr, socklen_t * addrlen)
这个函数是服务器端调用的
第一个参数指明哪个监听套接口,一般是由listen()系统调用指定的(由于每个
监听套接口都对应已连接和未连接两个队列,因此它的内部机制实质是通过
sockfd指定在哪个已连接队列头中返回一个用于当前客户的连接,如果相应的已连
接队列为空,accept进入睡眠)。第二个参数指明客户的地址结构,
如果对客户的身份不感兴趣,可指定其为空。
5/通信
现在就可以明送秋波了。
常用的从套接口中接收数据的调用有:recv、recvfrom、recvmsg等,常用的向套接
口中发送数据的调用有send、sendto、sendmsg等。
6/关闭端口
秋波都送完了,赶紧关闭吧。close()
Scoket(套接口)通信基础
最新推荐文章于 2021-02-28 02:44:05 发布