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 ...
随机推荐
- CG-CTF misc部分wp
将Misc剥离出来了,已完结(coding gay不想做了) MISC1,图种一听图种,现将图片的GIF改为zip,然后解压得到另一张动图看动图最后一句话为‘都深深的出卖了我’,得到 flag2, 丘 ...
- git 版本控制库的用法及其介绍
版本控制 说到版本控制,脑海里总会浮现大学毕业是写毕业论文的场景,你电脑上的毕业论文一定出现过这番景象! 1 2 3 4 5 6 7 8 9 10 11 毕业论文_初稿.doc 毕业论文_修改1.do ...
- Cannot proxy target class because CGLIB2 is not available .Add CGLIB to the class path or specify proxy interfaces…..
报错:Cannot proxy target class because CGLIB2 is not available .Add CGLIB to the class path or specify ...
- Spring Boot中普通类获取Spring容器中的Bean
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,自己动手n ...
- Linux (ifconfig/docker) 移除网桥/虚拟网卡
今天上大数据实践课时,使用学校提供的云主机平台创建了几台vps,但是安全组配置好之后发现无法用ssh无法登录,ping也不通,提示网络无法到达. 但是拿别人的电脑试了下能顺利使用ssh连接. 有人说是 ...
- shell script 学习
终于来到了shell脚本的学习,貌似很牛叉. shell script鸟叔解释:利用shell的功能写的一个program,使用纯文本文件,将一些shell语法和指令写在里面,搭配正则表示法,管线命令 ...
- Python 调用自己编写的Class
假设自己写的 class 文件myPets.py放在当前目录的子目录/myClasses下,在myPets.py中定义了一个 class 叫Pet.现在要调用Pet这个 class : from my ...
- 【leetcode】959. Regions Cut By Slashes
题目如下: In a N x N grid composed of 1 x 1 squares, each 1 x 1 square consists of a /, \, or blank spac ...
- ArrayList,LinkedList,Vector集合的认识
最近在温习Java集合部分,花了三天时间读完了ArrayList与LinkedList以及Vector部分的源码.之前都是停留在简单使用ArrayList的API,读完源码看完不少文章后总算是对原理方 ...
- Andrdoid中对应用程序的行为拦截实现方式之----从底层C进行拦截
之前的一篇概要文章中主要说了我这次研究的一些具体情况,这里就不在多说了,但是这里还需要指出的是,感谢一下三位大神愿意分享的知识(在我看来,懂得分享和细致的人才算是大神,不一定是技术牛奥~~) 第一篇: ...