网络IPC:套接字接口概述

套接字接口实现了通过网络连接的不同计算机之间的进程相互通信的机制。

套接字描述符(创建套接字)

套接字是通信端点的抽象,为创建套接字,调用socket函数

#include<sys/socket.h>
int socket(int domain,int type,int protocol);
/*返回:成功,返回套接字描述符,失败,-1*/
  • 参数domain:确定通信特性,包括地址格式。如AF_INET IPV4 因特网域
  • 参数type:确定套接字类型,进一步确定套接字类型,如SOCK_DGRAM 固定长度,无连接,不可靠的报文传递(默认协议 UDP)。SOCK_STREAM 有序的,可靠的,双向的,面向连接的字节流(默认协议 TCP)。
  • 参数protocol:通常为零,表示为给定的域和套接字类型选取默认协议。

例如

clientfd = socket(AF_INET,SOCK_STREAM,0);

其中,AF_INET 表明我们正在使用因特网,SOCK_STREAM表明这个套接字是因特网连接的一个端点,0默认为使用TCP协议。

套接字地址结构

从UNIX内核角度来看,一个套接字就是通信的一个端点,从unix程序来看,一个套接字就是一个相应描述符的打开文件

在利用套接字接口进行通信时,必须通过地址标识来标识一个目标通信进程,这个地址标识被称为套接字地址,是由一个计算机的网络地址和一个端口号表示,计算机网络地址用来标识特定计算机,端口号用来标识特定进程。

一个地址标识一个特定通信域的套接字端点,地址格式与这个特定的通信域有关,为使不同的地址格式能传入套接字函数,地址会被强制转换为一个通用的地址结构sockaddr:

struct sockaddr{
sa_family_t sa_family; //address family
char sa_data[ ]; //variable-length address
......
......
};

地址查询

POSIX.1定义了若干新函数,允许一个应用程序将一个主机名和一个服务名映射到一个地址,或者反之。

getaddrinfo 函数允许将一个主机名和一个服务名映射到一个地址。

#include<sys/socket.h>
#include<netdb.h>
int getaddrinfo(const char *restrict host,
const char *restrict service,
const struct addrinfo *restrict hint,
struct addrinfo **restrict res);
void freeaddrinfo (struct addrinfo *ai);

getnameinfo函数将一个地址转化为一个主机名和服务名

#include<sys/socket.h>
#include<netdb.h>
int getnameinfo(const struct sockaddr *restrict addr,socklen_t alen,
char *restrict host,socklen_t hostlen.
char *restrict service,socklen_t servlen,int flages);

将套接字与地址关联

对于服务器需要,需要给一个接收客户端请求的服务器套接字关联一个众所周知的地址。

使用bind函数来关联地址和套接字

#include<sus/socket.h>
int bind(int sockfd,const struct sockaddr *addr,socklen_t len);
/*返回值:成功,0;失败,-1*/

对于使用的地址有以下一些限制

  • 在进程正在运行的计算机上指定的地址必须有效;不能指定其他机器的地址。
  • 地址必须和创建套接字的地址族所支持的格式相匹配。
  • 地址中的端口号必须小于1024,除非该进程具有超级权限
  • 一般只能将一个套接字端点绑定在一个给定的地址上,尽管有些协议支持多重绑定。

建立连接

如果要处理一个面向连接的网络服务(SOCK_STREAM或SOCK_SEQPACKET),那么在开始交换数据之前,需要在请求服务的进程套接字和提供服务的进程套接字之间建立一个连接,使用connect函数建立连接。

#include<sys/socket.h>
int connect(int sockfd,const struct sockaddr* addr ,socklen_t len);
/*返回:成功 0,失败 -1*/

服务器调用listen函数来宣告它愿意接受连接请求.

#include<sys/socket.h>
int listen(int sockfd,int backlog);
/*返回:成功 0;失败 -1*/

参数backlog提供了一个提示,提示系统进程所要入队未完成连接的请求数量。

一但服务器调用了listen,所用的套接字就能完成接受连接请求。使用accept函数获得连接请求并建立连接。

#include<sys/socket.h>
int accept(int sockfd,struct sockaddr *restrict addr,socklen_t *restrict len);
/*返回值 成功:套接字描述符;失败 -1*/

注:

  • sockfd:为监听描述符,用来保持可用状态,并接受其他连接请求。
  • 函数返回的描述符为连接描述符,该描述符用来连接到调用connect的客户端。

数据传输

套接字端点表示为一个文件描述符,那么只要建立连接,就可以使用read,和writes来通过套接字通信。

还有6个专为套接字设计的数据传输函数

1.send函数和write很像,但是通过指定标志来改变处理传输数据的方式。

#include<sys/socket.h>
ssize_t send(int sockfd, const void *buf ,size_t nbytes ,int flags);
/*返回值 成功:返回发送的字节数;失败:-1*/

2.sendto函数,和send函数区别在于sendto函数可以在无连接的套接字上指定一个目标地址

#include<sys/socket.h>
ssize_t sendto (int sockfd ,const void *buf ,size_t nbytes ,int flages, const struct sockaddr *destaddr ,socklen_t destlen);
/*返回值 成功:返回发送的字节数;失败:-1*/

3.sendmsg函数

#include<sys/socket.h>
ssize_t sendmsg(int sockfd, const struct msghdr *msg ,int flags);
/*返回值 成功:返回发送的字节数;失败:-1*/

4.recv函数,与read类似,但recv函数可以指定标志来控制如何接收数据

#include<sys/socket.h>
ssize_t recv(int sockfd,void *buf, size_t nbytes, int flags);
/*返回值:成功,返回数据的字节长度;若无可用数据或对等方已经按序结束,返回 0;失败 -1*/

5.recvfrom函数,可以得到数据发送者源地址。

#include<sys/socket.h>
ssize_t recvfrom(int sockfd,void *buf, size_t nbytes, int flags,struct sockaddr *restrict addr,socklen_t *restrict addrlen);
/*返回值:成功,返回数据的字节长度;若无可用数据或对等方已经按序结束,返回 0;失败 -1*/

6.recvmsg函数,类似readv。

#include<sys/socket.h>
ssize_t recvmsg(int sockfd,struct msghdr *msg, int flags);
/*返回值:成功,返回数据的字节长度;若无可用数据或对等方已经按序结束,返回 0;失败 -1*/

网络IPC:套接字接口概述的更多相关文章

  1. 第十六章:网络IPC 套接字

    一.IP地址和端口 套接字接口可以用于计算机间通信.目前计算机间使用套接字通讯需要保证处于同一网段. 为了查看是否处于同一网段,我们可以使用IP地址判断. IP地址是计算机在网络中的唯一标识.IP地址 ...

  2. Unix环境高级编程(十七)网络IPC套接字

    通过网络套接字可以使得不同计算机上运行的进程相互通信. 1.创建套接字 #include <sys/socket.h> Int socket( int domain, int type, ...

  3. Unix套接字接口

    简介 套接字是操作系统中用于网络通信的重要结构,它是建立在网络体系结构的传输层,用于主机之间数据的发送和接收,像web中使用的http协议便是建立在socket之上的.这一节主要讨论网络套接字. 套接 ...

  4. UNIX网络编程——套接字选项(心跳检测、绑定地址复用)

    /* 设置套接字选项周期性消息检测连通性 心跳包. 心博.主要用于长连接. * 参数:套接字, 1或0开启, 首次间隔时间, 两次间隔时间, 断开次数 */ void setKeepAlive( in ...

  5. 【T05】套接字接口比XTI_TLI更好用

    1.用于网络编程的API接口有两种: Berkeley套接字 XTL 2.套接字是加州大学伯克利分校为其Unix操作系统版本开发的,TLI是AT&T(贝尔实验室)为Unix系统V3.0开发的 ...

  6. 网络编程 套接字socket TCP UDP

    网络编程与套接字 网络编程 网络编程是什么: ​ 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 ​ 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...

  7. c 网络与套接字socket

    我们已经知道如何使用I/O与文件通信,还知道了如何让同一计算机上的两个进程进行通信,这篇文章将创建具有服务器和客户端功能的程序 互联网中大部分的底层网络代码都是用C语言写的. 网络程序通常有两部分组成 ...

  8. 网络---中断套接字Socket

    package socketpack_2; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.even ...

  9. UNIX网络编程——套接字选项

    http://www.educity.cn/linux/1241288.html 有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt( ...

随机推荐

  1. vuex页面刷新数据丢失的解决办法

    在vue项目中用vuex来做全局的状态管理, 发现当刷新网页后,保存在vuex实例store里的数据会丢失. 原因: 因为store里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例 ...

  2. 几个不错的echarts +百度地图 案例

    https://echarts.baidu.com/examples/editor.html?c=map-polygon https://echarts.baidu.com/examples/edit ...

  3. 【JUC】3.ReentrantLock

    ReentrantLock实现Lock接口,所以先看下Lock接口: public interface Lock { // 获得锁 void lock(); // 获得锁 void unlock(); ...

  4. Linux之redis-sentinel

    一,Redis-Sentinel介绍 Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,redis本身或 ...

  5. 虚拟机NAS存储的安装

    1.下载一款免费的NAS系统fressNAS 下载网址;https://www.freenas.org/download/ 2.选择配置好虚拟机(内存设置8G最好,选择桥接) 不要做任何操作等待进入安 ...

  6. 【HICP Gauss】数据库 环境的搭建 -1

    1.安装规则    1.主机名必须网络唯一  2.主机名必须两位数以上 可以中划线 不能下划线  3.固定IP地址  4.端口号 1888 新增账户 omm 用户组 dbgrp ,家目录 /home/ ...

  7. 大数据技术之Hadoop3.1.2版本完全分布式部署

    大数据技术之Hadoop3.1.2版本完全分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主机环境准备 1>.操作系统环境 [root@node101.yinz ...

  8. 采用MySQL-MMM做DB高可用时,遇到的一个小坑

    一.服务器分布   二.MySQL-MMM 配置 (1).公共配置[所有DB节点:Master1.Master2.Slave1.Slave2   Monitor节点] # vim /etc/mysql ...

  9. node-images 进行图片压缩

    前置条件:先安装images npm install images 编写代码 思路: 从指定文件夹遍历图片,执行压缩,压缩完成后放到指定文件夹中,并保持图片名无变化. var images = req ...

  10. "人工智能",你怕了吗?

    近期“人工智能+”,已经是市场上非常火的一个风口,人工智能已经渗透到人类生活的方方面面,服务于我们的生活.但是人工智能的迅速发展,也引起了我的担忧,一系列科技电影展示出来的人工智能奴役人类的场景,让人 ...