网络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. 在Xcode4 中将iPhone使用的xib转换成iPad使用的xib

    来源:http://blog.3snews.net/space.php?uid=6188&do=blog&id=64200 http://www.giser.net/?p=982 1 ...

  2. Sql 按日期带条件统计

    select convert(char(8),[UseTime],112) dt,sum([UseMoney]) 合计,sum(case when [S_Number]=2 then UseMoney ...

  3. 【zookeeper】linux中编写脚本批量启动zookeeper

    实现功能:一键启动.关闭主从端3个节点上的zookeeper,附加查看启动状态 mkdir bin --新建文件夹 cd bin 跳转到bin文件夹里 touch zookeeperstart.sh ...

  4. Android笔记(四十一) Android中的数据存储——SQLite(三)select

    SQLite 通过query实现查询,它通过一系列参数来定义查询条件. 各参数说明: query()方法参数 对应sql部分 描述 table from table_name 表名称 colums s ...

  5. 【转】VC和VS的区别

    各个版本之间的对应关系 使用windows平台搞开发时,下载第三方库时经常会遇到文件名以VCxx版本号命令,VC版本如何转换成对应的VS的版本呢,这里总结一下vc和vs的关系. Microsoft V ...

  6. mysql学习之基础篇08 UTF8编码

    这次我们来说一下在Mysql中的编码问题: 我们知道应用于计算机的最早的字符集是ASCII,它所组成的编码是ASCII编码:由于对于其他国家来说它所容纳的字符个数比较少,后来就出现了ANSI字符集,它 ...

  7. 铁力项目mysql异常处理过程记录

    地区:铁力 故障:2019-06-26 10:19:34 139921514837760 [ERROR] mysqld: Error writing file 'mysql-bin' (errno: ...

  8. Codeforces C. A Simple Task(状态压缩dp)

    题目描述:  A Simple Task time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  9. 性能优化处理CPU快慢问题

    经常听到有人说磁盘很慢.网络很卡,这都是站在人类的感知维度去表述的,比如拷贝一个文件到硬盘需要几分钟到几十分钟,够我去吃个饭啦:而从网络下载一部电影,有时候需要几个小时,我都可以睡一觉了. 最为我们熟 ...

  10. LightOJ - 1294 - Positive Negative Sign(规律)

    链接: https://vjudge.net/problem/LightOJ-1294 题意: Given two integers: n and m and n is divisible by 2m ...