网络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. 简单了解Django应用app及分布式路由

    前言 应用在Django的项目中是一个独立的业务模块,可以包含自己的路由,视图,模板,模型. 一 创建应用程序 创建步骤 用manage.py中的子命令startapp创建应用文件夹 在setting ...

  2. java常用集合框架关系

    一.综合总图 1.所有集合类都位于java.util包下. 2.Java的集合类主要由两个接口派生而出:Collection和Map, 3.Collection和Map是Java集合框架的根接口,这两 ...

  3. 学习python的日常

    今天是开始正式接触python语言的第一天,然后来自前辈的知道开始了在学习过程当中用博客来记录自己的学习历程,以供自己更快地掌握这门编程语言. 大概的总结一下的话,还是按照我的编程的习惯,要学写代码, ...

  4. /sys 和 /dev 区别

    参考:What's the “/sys” directory for? Directory - /sys in linux 前言 各种Linux发行版下面似乎都有/sys目录,tree查看下面内容,会 ...

  5. Bash基础——减号-

    参考:Bash基础——pipe pipe命令在 bash 的连续的处理程序中相当重要.在pipe命令当中,常常会使用到前一个命令的 stdout 作为这次的 stdin , 某些命令需要用到文件名 ( ...

  6. Qt命名规范

    1) 类名:单词首字母大写,单词和单词之间直接连接,无需连接字符 如: MyClass,QPushButton class MainWindow { }; 2) 函数名字,变量名:第二个单词开始(不是 ...

  7. springboot错误: 找不到或无法加载主类

    一:当在eclipse启动spring boot项目时出现问题: springboot错误: 找不到或无法加载主类 解决办法: 1,通过cmd命令行,进入项目目录进行,mvn clean instal ...

  8. 如何使用MCUXpresso IDE创建一个Cortex-M工程

    拿到Cortex-M开发板之后,就可以开始使用MCUXpresso IDE上手入门.在这个教程中,我们将详细介绍如何基于CMSIS(Cortex微控制器软件接口标准)在MCUXpresso IDE中为 ...

  9. python模块统计

    .处理日期和时间 datetime/time/pytz/dateutil/calendar 注:calendar有很广泛的方法用来处理年历和月历,例如打印某月的月历 .处理字符串 re .处理字符集编 ...

  10. 圆柱模板行业B2B站点打造MIP推送+熊掌号推送+历史普通推送插件

    最近因为做聚合页面http://zhimo.yuanzhumuban.cc/hotkey/list-951.html  内部站点关键词拥有5万的行业词库,所以这么多搜索词库,如何让百度第一时间抓取呢? ...