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.
 
注意这个不能用于无连接风格的套接字!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM