套接字编程常用函数

news/2024/5/17 15:30:32 标签: socket, tcp, udp, Unix网路编程

  不同协议的套接字编程(TCP套接字、UDP套接字、原始套接字等)的模型有所差异,但一般会使用到一下常用函数:

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int socket(int domain, int type, int protocol);
       int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
       int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
       int listen(int sockfd, int backlog);
       int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

这些函数主要作用如下:

函数名说明使用环境
socket()根据协议类型等 创建socket(套接字编程接口)TCP/UDP
connect()主动方向被动方建立连接、会发起TCP三次握手一般用于TCP
bind()socket套接字与本地协议地址绑定在一起TCP/UDP
listen()将套接字转换为被动套接字,并制定监听的最大连接输TCP服务器
Accept()用于返回下一个已完成连接TCP服务器

socket-函数">socket() 函数

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>
       int socket(int domain, int type, int protocol);

socket()函数用于创建套接字,socket()函数成功时返回一个类似于文件描述符的非负整数,我们称之为套接字描述符。套接字描述符 相当于一个供用户层与内核层进行通信的接口,socket()函数制定了套接字描述符的协议族、套接字类型。

  • family:协议族
  • type:套接字类型
  • protocol:协议类型
      不是所有的family和type组合都有效的,有一些组合是无效的

常用的协议族:

family说明
AF_INETIPv4 协议
AF_INET6IPv6协议
AF_LOCALUnix与协议
AF_ROUTE路由套接字协议
AF_KEY密钥套接字

socket函数的type值:

type说明
SOCK_STREAM字节流套接字
SOCK_DGRAM数据报套接字
SOCK_SEQPAKET有序分组套接字
SOCK_RAW原始套接字

常用的protocol:

protocol说明
IPPROTO_TCPTCP传输协议
IPPROTO_UDPUDP传输协议
IPPROTO_SCTPSCTP传输协议

connect() 函数

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>
       int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

  connect()函数用于通信中的主动方向被动方发起建立连接的请求。对于TCP套接字来说,connect()函数会激发TCP的三次握手。
+ sockfd:套接字描述符,由socket()函数返回的。
+ addr:指向对端套接字地址结构的指针。
+ addrlen:对端套接字地址结构的大小

bind() 函数

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>
       int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);

  bind()函数用于将本地协议地址与socket()函数创建的套接字绑定起来,(实际上是将本地协议地址赋予了一个套接字)。对于网际网协议来说,本地协议地址是IP地址与16bit的端口号的组合。
+ sockfd: 套接字描述符,由前面的socket()函数成功时返回
+ myaddr: 指向本地协议地址结构对象的指针
+ addrlen: 本地协议地址结构的大小。
  在套接字编程中,bind()函数告诉应用程序,数据应该从哪个端口(IP地址+端口号)发送,以及应该从哪个端口接收数据。一些应用程序可能没有调用bind()函数来显示指定本地协议地址(或者只是制定了IP地址或端口号的其中一项),如TCP客户端一般在connect()之前并没有调用bind()制定本地协议地址,但是内核会为TCP客户端选择一个临时端口。 对于TCP服务器来说,一般都要制定本地协议地址,TCP服务器需要捆绑众所周知的端口,以便客户端能够对其发起通信。

listen() 函数

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>
       int listen(int sockfd, int backlog);

  listen()函数仅有TCP服务器调用,主要有两个作用:
1. 将一个未连接的套接字转换为被动套接字,指示内核应该接收指向该套接字的连接请求。(socket()函数创建套接字时,默认设为主动套接字)
2. 指定内核应该为相应的套接字排队的最大连接个数。
+ sockfd: 套接字描述符,由前面的socket()函数成功时返回
+ backlog: 指定内核应该为相应的套接字排队的最大连接个数。
内核为一个给定的监听套接字维护两个队列
+ 未完成连接的队列: 服务器接受到了TCP三次握手的第一次握手,即接收到SYN分节,但三次握手还没有完成。
+ 已完成连接的队列: 三次握手已经完成,成功建立连接

* 未完成连接队列 和 已完成连接队列 的队列总数应该小与backlog*

accept() 函数

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>
       int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

  accept()函数有TCP服务器调用,用于返回下一个已完成连接。如果已完成连接队列为空,则阻塞。
+ sockfd: 内核创建的新的套接字描述符,用于描述与返回的客户端之间的连接
+ addr:对端进程(客户端)的协议地址
+ addrlen: 对端协议地址结构的大小。


http://www.niftyadmin.cn/n/1079011.html

相关文章

LeetCode111——Given a binary tree, find its minimum depth.

The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. 之后发的文章就不翻译了&#xff0c;因为一般读这个文章的人都是刷LeetCode的人&#xff0c;读题目应该不成问题&#xff0c;我就不做多余的翻译了。 难…

微信小程序点击按钮推送模板消息给自己(一步操作)

我们在上一篇微信小程序模板消息定时推送&#xff0c;只需要简单三步就好中介绍了如何创建微信小程序推送API接口。 那么我们这里就扩展一下&#xff0c;如何在小程序中通过用户点击操作&#xff0c;立即推送模板消息给小程序当前的用户。 场景 一般这种情况适用于如下场景&…

网站建设与关键词

网站建设的整个过程中&#xff0c;从网站的规划到网站优化最终的设计都应考虑到seo的问题&#xff0c;不能到了推广的时候才关注SEO知识&#xff0c;有些SEO知识在网站策划的时候就应该考虑到的&#xff0c;那么网页设计就应该把相关的优化建议作为网站开发规范.. seo应贯穿于网…

小程序客服消息经常忘记看?简单设置,立即提醒!

场景分析 某用户在使用小程序的过程中&#xff0c;发现了某些BUG&#xff0c;需要联系这个小程序的开发人员。 微信小程序提供了客服消息系统&#xff0c;允许用户跳转到客户聊天界面进行反馈交流。 但是&#xff01;&#xff01; 用户在提交反馈信息之后&#xff0c;我们作…

网站建设与关键词http://www.360seo.cn/

http://www.360seo.cn/网站建设的整个过程中&#xff0c;从网站的规划到网站优化最终的设计都应考虑到seo的问题&#xff0c;不能到了推广的时候才关注SEO知识&#xff0c;有些SEO知识在网站策划的时候就应该考虑到的&#xff0c;那么网页设计就应该把相关的优化建议作为网站开…

LeetCode110——Balanced Binary Tree

Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 难度系数&#xff1a; 容易 实现 int getDe…

微信动态小程序码创建,原来还可以这么简单!

现在古人云小程序开发平台已经完成vCode小程序动态码接口并进行了上线使用 你只需要进行简单的一两个点击输入操作&#xff0c;就可以创建出自己的小程序的动态码图片接口&#xff01; 应用场景 图文分享海报的动态参数小程序码印刷LOGO的固定页面小程序码一些签到打卡、扫一…

《互联网搜索引擎立法建议书》

12月17日消息&#xff0c;IT著名律师李长青今日向整合网络营销专家上海珍岛透露&#xff0c;自己准备和张新维律师一起&#xff0c;向国务院提交《互联网搜索引擎立法建议书》&#xff0c;并公布了自己拟定的十条建议。建议国务院尽快制定行政法规&#xff0c;以规范搜索引擎运…