Scoket(套接口)通信基础

Scoket(套接口)通信基础

平时你可能都听说,“用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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值