linux 套接字
三.命名套接字
之前的socket只是创建了一个没有名字的资源,其他进程无法访问他.所以也无法从它接受消息.只有当bind给套接字绑定了端口和名字后,其他进程才能找到它.
一般服务器是一定要bind,但是客户端就不一定了.如果做一个简单的echo服务器的话,那么客户端只直接去connect服务器就可以了.
绑定函数int bind(int socket,const struct sockaddr *address,socklen_t address_len);
socket就是socket函数返回的描述字.第二个参数是通用接口!所以如果你的地址结构体用的不是这个,那么一定要有强制转换!!第三个参数是未转换前的地址结构体的大小+1.
返回值0为正常,-1则设置errno表示出错.
绑定之后,就是connect和listen了.开始区分客户端和服务端了.
四.套接字通信模式
首先,通信模式分为两种,TCP和UDP.
前者面向连接,后者则以报文形式发送.
下图是TCP的编程过程.
这是UDP的编程过程.
看完了编程模式,现在再来看具体函数是怎么执行的吧~
五.流套接字操作
1.connect
原型int connect (int socket,const struct sockaddr *address,socklen_t address_len);
首先这个是用于客户端的.这里的socket就是本地的socket描述字,address是服务器端的地址信息.最后的address_len为其原先地址的长度.
返回值0为正常,错误返回-1,并设置errno,错误条件有:
EBADD: 参数socket不是合法的套接字描述字
EALREADY: 已经有一悬挂的连接正在被处理
ETIMEDOUT: 建立连接的时间限已过而未能建立连接.
ECONNREFUSED: 服务端拒绝此连接.
EINTR: 建立连接的企图被捕获的信号所中断
这个连接产生问题的情况比较多,我写的细一点:
正常情况下连接肯定是正常的.如果连接超时,则返回并流产连接请求.
如果connect在连接过程中被信号中断,那么虽然也错误返回.但是请求并不流产.连接会被异步建立.
如果建立套接字的时候设置了O_NONBLOCK的话,如果不能被立即建立的话,那么也会和被中断的时候一样,连接异步的建立.
针对这种异步的情况,可以用select或者poll来查询连接是否就绪.
2.listen
原型int listen(int socket,int backlog);
函数会为第一个参数建立一个连接请求的侦听队列,然后这个队列就会成为一个服务器套接字,也叫被动套接字.第二个参数则是用来设置其队列的最大长度的.如果设置的值大于系统规定的最大限制值时,这种情况下,当侦听队列的连接请求超过系统的限制值时,系统会自动的截断backlog的值为系统最大值.如果设置为小于0,则自动设置为0
当返回值为0时表示成功,失败则返回-1并设置errno.
注意这个不能用于无连接风格的套接字!
linux 套接字的更多相关文章
- linux 套接字编程入门--Hello World
下述代码是linux套接字编程的入门代码.分为服务端和客户端源码. 服务端代码的主要流程是绑定ip地址和端口号建立套接字,等待客户端发起访问.接受客户端请求之后,向客户端发送字符串"hell ...
- Linux 套接字编程中的 5 个隐患(转)
本文转自IBM博文Linux 套接字编程中的 5 个隐患. “在异构环境中开发可靠的网络应用程序”. Socket API 是网络应用程序开发中实际应用的标准 API.尽管该 API 简单,但是开发新 ...
- 【 Linux 】Linux套接字简要说明
Linux套接字 源IP地址和目的IP地址以及源端口和目标端口号的组合称为套接字.其作用于标识客户端请求的服务器和服务. 套接字,支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间 ...
- socket - Linux 套接字
总览 #include <sys/socket.h> mysocket = socket(int socket_family, int socket_type, int protocol) ...
- (转载)Linux 套接字编程中的 5 个隐患
在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性.事实上,很难找到一种不支持 Sockets API 的现代语言.该 API 相当简单,但新的开 ...
- Linux套接字编程
网络中的进程是如何通信的? 在网络中进程之间进行通信的时候,那么每个通信的进程必须知道它要和哪个计算机上的哪个进程通信.否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行 ...
- Linux 套接字编程中的 5 个隐患
http://www.ibm.com/developerworks/cn/linux/l-sockpit/ 在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系 ...
- Linux 套接字编程中要注意的细节
隐患 1.忽略返回状态 第一个隐患很明显,但它是开发新手最容易犯的一个错误.如果您忽略函数的返回状态,当它们失败或部分成功的时候,您也许会迷失.反过来,这可能传播错误,使定位问题的源头变得困难. 捕获 ...
- windows和linux套接字中的select机制浅析
先来谈谈为什么会出现select函数,也就是select是解决什么问题的? 平常使用的recv函数时阻塞的,也就是如果没有数据可读,recv就会一直阻塞在那里,这是如果有另外一个连接过来,就得一直等待 ...
- Linux 套接字通信笔记(一)
协议 TCP(传输控制协议),UDP(用户数据包协议)为传输层重要的两大协议,向上为HTTP提供底层协议,向下为数据链路层封装底层接口,乃是通信重中之重.TCP是面向流传输的协议,在编程中形象化为St ...
随机推荐
- FastAdmin 关于列表渲染文字过长导致页面难以管理的问题
先贴一张图片做个例子 看不清图片的朋友可以右键图片,在<新标签页中打开图片>; 可以看到,由于内容过长,导致后面操作的增删改要拉到最后才能操作. 在我们的FastAdmin中,目前我还没找 ...
- 嵌入式平台 RAM与ROM区分
ROM(Read Only Memory)和RAM(Random Access Memory)指的都是半导体存储器,ROM在系统停止供电的时候仍然可以保持数据,而RAM通常是在掉电之后就丢失数据,典型 ...
- Mac下homebrew的安装与卸载
mac系统常用的软件安装工具就是homebrew 个人认为通过brew安装比较简单,下面介绍下如何安装 安装和卸载homebrew 安装 /usr/bin/ruby -e "$(curl - ...
- vue在element-ui的dialog弹出框中加入百度地图
参考:https://blog.csdn.net/u012724595/article/details/82703579 <!-- gps弹窗 --> <el-dialog v-di ...
- java多线程面试题_线程并发面试题
1.什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个 ...
- pip install RISE报错解决
ERROR: Cannot uninstall 'tornado' ERROR: Cannot uninstall 'tornado'. It is a distutils installed pro ...
- Shiro学习(24)在线回话管理
有时候需要显示当前在线人数.当前在线用户,有时候可能需要强制某个用户下线等:此时就需要获取相应的在线用户并进行一些操作. 本章基于<第十六章 综合实例>代码构建. 会话控制器 Java代码 ...
- 牛客 某练习赛 Data Structure
Data Structure 题目描述 将一个非负整数序列划分为 \(K\) 段,分别计算出各段中的整数按位或的结果,然后再把这些结果按位与起来得到一个最终结果,把这个最终结果定义为这个序列的一个 \ ...
- 【LeetCode 23】合并K个排序链表
题目链接 [题解] 会归并排序吧? 就把这K个链表当成是K个数字就好. 然后做归并排序. 因为归并排序的时候本来就会有这么一个过程. [l..mid]和[mid+1..r]这两段区间都是有序的了已经. ...
- 【Flutter学习】基本组件之基本按钮组件
一,概述 由于Flutter是跨平台的,所以有适用于Android和iOS的两种风格的组件.一套是Google极力推崇的Material,一套是iOS的Cupertino风格的组件.无论哪种风格,都是 ...