目录

1.socket

2.bind

3.listen

4.connect

5.send

6.recv

7.select

8.setsockopt

9.closesocket

10.总结辨析

10.1 listen\connect\accept与三次握手的关系


1.socket

/*
参数介绍:
domain:协议域,(常见的协议组用AF_INET、AF_INET6、AF_LOCAL、AF_ROUTE)协议族决定了socket的地址类型,在通信中必须采用相应的地址;
type:socket的类型,(流格式套接字(SOCK_STREAM)、数据报格式套接字(SOCK_DGRAM));
protocol:协议,常见的协议有IPPROTO_TCP、IPPTOTO_UDP、 IPPROTO_SCTP、IPPROTO_TIPC他们分别对应这TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。当protocol为0时,会自动选择type类型对应的默认协议;返回值:返回一个文件描述符,SOCKET类型本身也是定义为int的,既然是文件描述符,那么在系统中都当作是文件来对待的。0、1、2分别表示标准输入、标准输出、标准错误。所以其他打开的文件描述符都会大于2, 错误时就返回 -1。这里INVALID_SOCKET 也被定义为 -1。
*/
int socket(int domain, int type, int protocol)

2.bind

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

参数介绍:
第一个参数socket函数返回的文件描述符,唯一标识一个socket;
第二个参数;
第三个参数;

返回值:

3.listen

int listen(int sockfd, int backlog)

参数介绍:
第一个参数socket函数返回的文件描述符,唯一标识一个socket;
第二个参数socket可以排队的最大连接数;

返回值:

4.accept

4.connect

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

参数介绍:
第一个参数socket函数返回的文件描述符,唯一标识一个socket;
第二个参数;
第三个参数;

返回值:

5.send

int send(SOCKET s, const char FAR *buf, int len, int flags);

参数介绍:
第一个参数指定发送端套接字描述符;
第二个参数指明一个存放应用程序要发送数据的缓冲区;
第三个参数指明实际要发送的数据的字节数;
第四个参数一般置0。
返回值:
send的返回值>0时,表示实际发送了多少字节。注意:只是copy到系统缓存里,系统决定什么时候会发送这些数据。
send的返回值==0时,这个在send空串时会发生,是正常的。
send的返回值<0时(只会等于-1吧),需要检查errno,当errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN时,连接正常,可以稍后再试。其他的就是连接异常了。

6.recv

int recv(SOCKET s, char FAR *buf, int len, int flags);

参数介绍:
第一个参数指定接收端套接字描述符;
第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
第三个参数指明buf的长度;
第四个参数一般置0。
返回值:
recv的返回值>0时,表示实际接受到多少字节。
recv的返回值==0时,表示连接断开,也就是收到了FIN或者RST。
recv的返回值<0时,检查errno,和send类似。

7.select

int select(int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout)

参数介绍:
第一个参数监视对象文件描述符数量;
第二个参数将所有关注“是否存在待读取数据”的文件描述符注册到fd_set变量,并传递其地址值;
第三个参数将所有关注“是否可传输无阻塞数据”的文件描述符注册到fd_set变量,并传递其地址值;

第四个参数将所有关注“是否发生异常”的文件描述符注册到fd_set变量,并传递其地址值;

第五个参数调用select后,为防止陷入无限阻塞状态,传递超时信息;

返回值:错误返回-1,超时返回0。当关注的事件返回时,返回大于0的值,该值是发生事件的文件描述符数。

8.setsockopt

int PASCAL FAR setsockopt(SOCKET s,int level,int optname,const char FAR *optval,int optlen);

参数介绍:
第一个参数是标识一个套接字的描述符。
第二个参数是选项定义的层次;目前仅支持SOL_SOCKET和IPPROTO_TCP层次。
第三个参数是需设置的选项。
第四个参数是指针,指向存放选项值的缓冲区。
第五个参数是optval缓冲区长度。

9.closesocket

10.总结辨析

10.1 listen\connect\accept与三次握手的关系

服务器调用listen进行监听
客户端调用connect来发送syn报文(connect()函数在第二次握手syn ack后返回)
服务器协议栈负责三次握手的交互过程。连接建立后,往listen队列中添加一个成功的连接,直到队列的最大长度。
服务器侧,accept()函数负责查看listen队列里面有没有成功连接,如果有则从队列中取出,没有则阻塞(直到获得一个成功连接返回)。它每取出一个成功连接,listen队列中的连接个数就少一个,就会生成一个对应的accept fd,用于唯一标识该连接成功的客户端。(accept()函数在三次握手完成后返回)

socket通信函数解析相关推荐

  1. socket通信函数的深入分析

    平时我们可能会用 socket 通信做个作业交给老师,一般情况下,都是拷贝一段代码,ip 地址改下,端口号改下也就可以了,即使是会写 socket 通信程序,甚至是使用 socket 做一个文件传输的 ...

  2. nodejs python 通信_Nodejs环境实现socket通信过程解析

    结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...

  3. socket通信函数

    TCP协议 - CSDN博客 https://blog.csdn.net/coolwriter/article/details/79178950 1.网络中进程之间如何通信? 本地的进程间通信(IPC ...

  4. socket主要函数说明

    1.   基本套接字函数 (1)socket函数原型 socket(建立一个socket文件描述符) 所需头文件 #include <sys/types.h> #include <s ...

  5. socket主要函数介绍

    1.   基本套接字函数 (1)socket函数原型 socket(建立一个socket文件描述符) 所需头文件 #include <sys/types.h> #include <s ...

  6. 【Socket网络编程】12. send()、recv()、sendto() 和 recvfrom() 函数解析

    send().recv().sendto()和recvfrom()函数解析 一般情况下,send().recv()在TCP协议下使用,sendto().recvfrom()在UDP协议下使用,也可以在 ...

  7. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-代码解析...

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍一文之中我们对AgileEAS.NET S ...

  8. Java 网络实例三(获取URL响应头的日期信息、获取URL响应头信息、解析URL、ServerSocket和Socket通信实例)

    获取 URL响应头的日期信息 以下实例演示了如何使用 HttpURLConnection 的 httpCon.getDate() 方法来获取 URL响应头的日期信息: import java.net. ...

  9. socket通信简介(概念、函数、原理)

    "一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信 ...

最新文章

  1. php 重新载入类文件夹,php-如何配置Behat从应用程序特定文件夹自动加载类
  2. Simulink仿真---PMSM滞环电流控制仿真模型学习
  3. 初步认识Linux oops 消息
  4. Java 条件编译 Conditional Compilation
  5. 用python的五种方式_Python模块重载的五种方法
  6. Metasploit 之生成木马(msfvenom)
  7. 以太坊智能合约 solidity 的常用的数据结构介绍
  8. iptables之NAT
  9. Vercel反向代理做CDN,免费给网站加速隐藏源站,可绑定域名
  10. OpenVSLAM:日本先进工业科技研究所新开源视觉SLAM框架
  11. 资源管理与调度系统-YARN资源隔离及以YARN为核心的生态系统
  12. 【Express】—Express路由请求
  13. 定期删除30天以前的elasticsearch的日志
  14. 初始Hibernate-关于hibernate的三种状态
  15. 使用FlyMcu ISP清除 STM32F411CE 芯片卡死
  16. web测试要点及基本方法
  17. 临床阅片有新招!华为与维卓致远发布三维影像阅片系统
  18. 树莓派(zero w)——硬件介绍与系统开机
  19. 云锁安装Linux服务器云锁安装说明
  20. 数学三次方的计算机符号,数学符号三次方

热门文章

  1. 惊! 程序员S哥new了一个3D女朋友!
  2. 逻辑推理:王教授来自哪里(c语言代码实现)
  3. python控制电脑定时开机关机_如何实现电脑在指定的时间自动开机?
  4. HTML开发实例-简单相亲网站开发(主体为table)
  5. 前端HTML基础小练习-制作一个相亲表单
  6. teradata 查看 表定义_teradata查询表结构,
  7. android 学习随笔十三(网络:多线程下载)
  8. Spring Boot 2.x 入门前的准备-IntelliJ IDEA 开发工具的安装与使用
  9. LaTeX 关于缩进的设置取消默认的段落前的首行缩进
  10. 启动Web Tours 服务