1.bind

bind函数用于将套接字与指定端口相连.本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。

头文件

<sys/types.h>

<sys/socket.h>

函数形式

int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

返回值

成功

失败

是否设置errno

bind函数中的sockfd参数为调用socket函数后返回的文件描述符。my_addr参数为指向sockaddr结构体的指针(该结构体中保存有端口和IP地址信息)。addlen参数为结构体sockaddr的长度.

错误信息:
EACCES:地址受到保护,用户非超级用户。
EADDRINUSE:指定的地址已经在使用。
EBADF:sockfd参数为非法的文件描述符。
EINVAL:socket已经和地址绑定。
ENOTSOCK:参数sockfd为文件描述符。

2.Listen

它的函数原型为:

#include<sys/socket.h>
intlisten(intsockfd,intbacklog)
返回:0──成功,-1──失败

listen函数在一般在调用bind之后-调用accept之前调用。

用户在调用socket函数之后,返回一个套接字sockfd. sockfd默认一个主动连接的套接字,也就是此时系统假设用户会对这个套接字调用connect函数,期待它主动与其它进程连接,然后在服务器编程中,用户希望这个套接字可以接受外来的连接请求,也就是被动等待用户来连接。由于系统默认时认为一个套接字是主动连接的,所以需要通过某种方式来告诉系统,用户进程通过系统调用listen来完成这件事。
listen函数可使得流套接字sockfd处于监听状态,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。

处于监听状态的套接字sockfd将维护一个客户连接请求队列,该队列最多容纳backlog个用户请求。

3. accept函数

服务器编程中最重要的一步是等待并接受客户的连接,那么这一步在编程中如何完成,accept函数就是完成这一步的。它从内核中取出已经建立的客户连接,然后把这个已经建立的连接返回给用户程序,此时用户程序就可以与自己的客户进行点到点的通信了。

accept函数等待并接受客户请求:

#include<sys/socket.h>
int accept(int sockfd, struct sockaddr* addr, socklen_t* len)
返回:非负描述字——成功, -1——失败

accept默认会阻塞进程,直到有一个客户连接建立后返回,它返回的是一个新可用的套接字,这个套接字是连接套接字。此时我们需要区分两种套接字,一种套接字正如accept的参数sockfd,它是监听套接字,在调用listen函数之后,一个套接字会从主动连接的套接字变身为一个监听套接字;而accept返回是一个连接套接字,它代表着一个网络已经存在的点点连接。自然要问的是:为什么要有两种套接字?原因很简单,如果使用一个描述字的话,那么它的功能太多,使得使用很不直观,同时在内核确实产生了一个这样的新的描述字。
参数sockfd就是上面解释中的监听套接字,这个套接字用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号,而此时这个端口号正与这个套接字关联。当然客户不知道套接字这些细节,它只知道一个地址和一个端口号。
参数addr 是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址,当然这个地址是通过某个地址结构来描述的,用户应该知道这一个什么样的地址结构。如果对客户的地址不感兴趣,那么可以把这个值设置为NULL。
参数len 也是结果的参数,用来接受上述addr的结构的大小的,它指明addr结构所占有的字节个数。同样的,它也可以被设置为NULL。

如果accept成功返回,则服务器与客户已经正确建立连接了,此时服务器通过accept返回的套接字来完成与客户的通信。

可以用下面的例子来作个总结:

你可以想象发生 这样的事情:有人从很远的地方通过一个你在侦听 (listen()) 的端口连接 (connect()) 到你的机器。它的连接将加入到等待接受 (accept()) 的队列 中。

你调用 accept() 告诉它你有空闲的连接。它将返回一个新的套接字文 件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口, 新的在准备发送 (send()) 和接收 ( recv()) 数据。这就是这个过程!

网络编程socket之bind、Listen 及 accept相关推荐

  1. Linux网络编程——socket、bind、listen、accpet、connect、read和write

    Linux网络编程 基础理论 1.TCP/UDP/端口号 2.字节序 一.socket服务器与客户端的开发步骤 二.具体使用步骤 1.socket(创建连接协议) 2.bind(地址准备好) 3.li ...

  2. TCP网络编程中connect()、listen()和accept()三者之间的关系

    https://blog.csdn.net/tennysonsky/article/details/45621341 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: ...

  3. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数 对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...

  4. accept 阻塞_TCP网络编程中connect()、listen()和accept()三者之间的关系

    基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数 对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...

  5. socket网络编程-socket()、bind()、setsockopt()、recvfrom()、sendto()函数

    socket()函数 ​ socket()函数的原型如下,这个函数建立一个协议族为domain.协议类型为type.协议编号为protocol的套接字文件描述符.如果函数调用成功,会返回一个标识这个套 ...

  6. 网络编程socket之accept函数

    网络编程socket之accept函数 摘要:对于服务器编程中最重要的一步等待并接受客户的连接,那么这一步在编程中如何完成,accept函数就是完成这一步的.它从内核中取出已经建立的客户连接,然后把这 ...

  7. Python网络编程(Socket)

    Python网络编程(Socket) Python提供了两个访问级别的网络服务.在一个较低的水平,您可以访问底层操作系统的基本套接字支持,允许你实现面向连接和无连接协议的客户端和服务器 Python有 ...

  8. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  9. Linux 网络编程——socket 网络编程

    文章目录 一.网络基础 TCP/UDP对比 TCP/IP协议族体系 socket IP地址 IP地址转化API inet_addr() inet_aton() inet_ntoa() inet_pto ...

最新文章

  1. Mini汽车的保养周期
  2. 大剑无锋之HTTP连接、Tcp三次握手四次挥手、Tcp状态
  3. html5做旋转太极图,HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)...
  4. 游戏服务器出现问题怎么维护权益,游戏服务器出问题怎么解决
  5. 微软2008系列 (Orcas + Longhorn Server+SQL2008)将于2008年2月27日发布
  6. 数据库实例:mysql与mongo结合用户登录
  7. jQuery插件写法
  8. 借书问题(入门级算法)(C语言)
  9. arm电子相册项目——启动加载篇startup.s
  10. VB程序设计练习题(2022年新)
  11. 面试官最后说,你还有什么要问的吗?
  12. PLC同时连接多个触摸屏和电视机显示器解决方案
  13. Day20(lambda、stream、微服务、大数据、nginx)
  14. 缓冲区,缓存,fflush(stdin)如何使用?
  15. 用友T3建立年度帐提示:对象名TAX_SB_NSSB_BJ_ZB无效
  16. python账号怎么注销_登录后如何注销
  17. python numpy.arry, pytorch.Tensor及原生python中list相互转换
  18. 树莓派4安装Debian10
  19. 西瓜皮18.6.27
  20. 安卓火狐导出书签_firefox火狐浏览器中怎么导出书签备份收藏夹?

热门文章

  1. 互联网常用的网络用语
  2. 【Opencv】2D射影儿何和变换——柱面投影,图像拼接柱面投影
  3. Python打印菱形
  4. 今天的“指导”感触:融会贯通;雄关漫道真如铁,而今漫步从头越!
  5. python夯实基础日记-序列、列表、元组
  6. [影评]电影《喜剧之王》评论两篇(1、喜剧之王:永不退缩的人生 2、努力!奋斗!——再看《喜剧之王》)
  7. [弹幕词云姬]硬核b站up主一周撸出来的小工具,根据b站弹幕生成词云(一)
  8. Python-静态网页示例-豆瓣电影Top250
  9. WebSpider蓝蜘蛛网页抓取工具5.1用户手册
  10. .NetCore搭建的文件服务有些文件不能下载