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 ...
随机推荐
- Oracle中删表遇到ORA-14452
删表的时候碰到表忙的情况,会报错. DROP TABLE TMP_TAB_T_AGENT * ERROR at line 1: ORA-14452: attempt to create, alter ...
- 《node.js开发指南》partial is not defined的解决方案
由于ejs的升级,<node.js开发指南>中使用的 partial 函数已经摒弃,使用foreach,include代替 原来的代码是: <%- partial('listitem ...
- Shell内置命令 eval
- 关于js中Ajax的同步、异步使用
下面一个简单的例子,说明前后端交互中,Ajax同步和异步的使用 1.设置简单的一个div,包含触发事件 CompanyType() <div> <input type="h ...
- STM32三种BOOT模式介绍
一.三种BOOT模式介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存.用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启 ...
- vue 重定向
//重定向 { path: '/*', component: Home}
- 异步ajax请求数据处理
jQuery.ajax(url,[settings]) 概述 通过 HTTP 请求加载远程数据. jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax ...
- js 实时计算文本框字数限制
$.fn.myTarea = function(){ return this.each(function(){ $(this).bind('input propertychange', functio ...
- 批量新增数据(BuckCopy)
批量新增数据(BuckCopy) 使用webService传输数据时要注意,Datatable中的数据类型,以及科学计数 /// <summary> /// 批量新增数据 /// < ...
- 2018.12.26 考试(哈希,二分,状压dp)
T1 传送门 解题思路 发现有一个限制是每个字母都必须相等,那么就可以转化成首尾的差值相等,然后就可以求出\(k-1\)位的差值\(hash\)一下.\(k\)为字符集大小,时间复杂度为\(O(nk) ...