套接字API
Q:套接字特点
A:管道,消息队列,信号量,共享内存这些通信机制只能允许同一计算机上运行的进程相互通信,而套接字不仅可以提供在同一计算机上的进程间通信,还可以提供不同计算机上的进程间通信。
服务器端:
创建套接字描述符->将套接字与地址关联->监听套接字->接受链接
客服端:
创建套接字描述符->发起链接
创建套接字描述符
int socket(int domain, int type, int protocol);
domain: 通信特点,如AF_INET,IPv4因特网域
type: 套接字类型,如SOCK_STREAM字节流,SOCK_DGRAM数据报
type参数与下面标志相与:
SOCK_NONBLOCK创建非阻塞的socket
SOCK_CLOEXEC fork调用创建子进程时,子进程关闭该socket
protocol: 通常是0,选择默认协议。如果domain和type支持多个协议是,可以用
protocol指定一个特点的协议。
将套接字与地址关联
int bind(int sockfd, const struct sockaddr *addr, socklen_t len);
将一个客户端的套接字关联上一个地址没有意义,可以让系统选一个默认的地址。所以如果调用connect或listen,但是没有将地址绑定到套接字上,系统会选一个地址绑定到套接字上。但是服务器端需要绑定一个地址,让客户端可以指定连接地址。
addr限制:
- 指定地址必须有效,端口号不能被占用,IP地址和计算机IP地址吻合
- 地址必须与创建套接字是的地址组协议相匹配
- 只能将一个套接字绑定到一个地址上
发起链接
int connect(int sockfd, const struct sockaddr *addr, socklen_t len);
如果用SOCK_DGRAM套接字调用connect,传送报文的目标会设置成connect调用中指定的地址,这样每次传送报文时就不用再提供地址额
监听套接字
int listen(int sockfd, int backlog);
服务器调用listen宣告它愿意接受连接请求
参数backlog仅作为一个提示,提示系统该进程所要入队的未完成链接请求数量,其实际值由系统决定。
接受链接
int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len);
函数accept返回一个套接字描述符,该描述符连接到客户端,和原始套接字sockfd需要区分开来。如果不关心客户端标识,可以将参数addr和len设为NULL。
调用accept前,将addr参数设为足够大的缓冲区用来存放地址,len设为缓存区大小
返回时,accept会在缓冲区填充客户端的地址,并且更新len
套接字API的更多相关文章
- Java13新特性 -- 重新实现旧版套接字API
全新实现的 NioSocketImpl 来替换JDK1.0的PlainSocketImpl. 它便于维护和调试,与 NewI/O (NIO) 使用相同的 JDK 内部结构,因此不需要使用系统本地代码. ...
- 《Unix网络编程》卷一(简介TCP/IP、基础套接字编程)
通常说函数返回某个错误值,实际上是函数返回值为-1,而全局变量errno被置为指定的常值(即称函数返回这个错误值). exit终止进程,Unix在一个进程终止时总是关闭该进程所有打开的描述符. TCP ...
- 【unix网络编程第三版】阅读笔记(二):套接字编程简介
unp第二章主要将了TCP和UDP的简介,这些在<TCP/IP详解>和<计算机网络>等书中有很多细致的讲解,可以参考本人的这篇博客[计算机网络 第五版]阅读笔记之五:运输层,这 ...
- UNP学习笔记(第三章:套接字编程简介)
本章开始讲解套接字API. 套接字地址结构 IPv4套接字地址结构 它以sockaddr_in命名,下面给出它的POSIX定义 struct in_addr { in_addr_t s_addr; } ...
- windows下的套接字IO模型
一般情况下,IO操作的行为受两种因素的影响: IO操作对象的类型(阻塞还是非阻塞) 获取IO操作结果的方式(同步还是异步). 同步就是指操作的发起和操作结果的获取由调用者完成. 异步指操作发起由调用方 ...
- 伯克利套接字(BSD Socket)
http://blog.csdn.net/blueman2012/article/details/6693605#socket.28.29 伯克利套接字(Berkeley sockets),也称为BS ...
- 套接字编程简介: IPV4套接字地址结构/ 通用套接字地址结构/ IPV6套接字地址结构/新通用套接字地址结构
IPv4套接字地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in命名,定义在<netinet/in.h>头文件中. struct in_addr { in_addr_t ...
- 计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制.从所处的地位来讲,套接字上联应 ...
- Linux网络通信(TCP套接字编写,多进程多线程版本)
预备知识 源IP地址和目的IP地址 IP地址在上一篇博客中也介绍过,它是用来标识网络中不同主机的地址.两台主机进行通信时,发送方需要知道自己往哪一台主机发送,这就需要知道接受方主机的的IP地址,也就是 ...
随机推荐
- MySQL插入数据异常
MySQL插入数据异常 1.错误如下: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:Dupli ...
- Exception sending context initialized event to listener instance of class
1.错误描述 严重:Exception sending context initialized event to listener instance of class org.springframew ...
- (八)java垃圾回收和收尾
垃圾回收机制:当一个对象不再被引用时,或者说当一个对象的引用不存在时,我们就认为该对象不再被需要,它所占用的内存就会被释放掉. 垃圾回收只是在程序执行过程中偶尔发生,java不同的运行时刻会产 ...
- Hibernate中的条件查询完成类
Hibernate中的条件查询有以下三个类完成: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类
- python实现简单排序算法
算法 递归两个特点: 调用自身 有穷调用 计算规模越来越小,直至最后结束 用装饰器修饰一个递归函数时会出现问题,这个问题产生的原因是递归的函数也不停的使用装饰器.解决方法是,只让装饰器调用一次即可,那 ...
- C#图解教程 第八章 表达式和运算符
表达式和运算符 表达式字面量 整数字面量实数字面量字符字面量字符串字面量 求值顺序 优先级结合性 简单算术运算符求余运算符关系比较运算符和相等比较运算符递增运算符和递减运算符条件逻辑运算符逻辑运算符移 ...
- Spring有什么缺点?
Spring有什么缺点如下: 1.jsp中要写很多代码: 2.控制器过于灵活,缺少一个公用控制器: 3.不支持分布式部署.
- 浅析Java 8新特性Method Reference
什么是方法引用 我们知道了什么是Lambda Expression以及如何使用,那么,Method References又是什么呢?Oracle Java Docs中这样说: They are com ...
- 【CJOJ1090】【洛谷1967】【NOIP2013】货车运输
题面 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆 ...
- [TJOI2015]旅游
树链剖分+线段树 线段树维护max,min,左往右的最大差,右往左的最大差 求LCA时一定要注意方向 # include <bits/stdc++.h> # define RG regis ...