IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> LWIP学习之Socket (API篇) -> 正文阅读

[网络协议]LWIP学习之Socket (API篇)

Socket API

1.Socket()

接口原型

int
lwip_socket(int domain, int type, int protocol)

函数作用:

用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数

函数入参:

domain地址族AF_INET(IP_V4)、AF_INET6(IP_V6)
type支持三种协议类型Socket protocol types (TCP/UDP/RAW)

#define SOCK_STREAM     1 //流式套接字提供可靠的、面向连接的通信流;它使用TCP 协议,从而保证了数据传输的正确性和顺序性。
#define SOCK_DGRAM      2// 数据报套接字定义了一种无连接的服 ,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP。
#define SOCK_RAW        3// 原始套接字允许对底层协议如IP或ICMP进行直接访问,功能强大但使用较为不便,主要用于一些协议的开发。

protocol
系统使用的协议,其定义如下

#define IPPROTO_IP      0
#define IPPROTO_ICMP    1
#define IPPROTO_TCP     6
#define IPPROTO_UDP     17

可以将 protocol 的值设为 0,系统会自动推演出应该使用什么协议。故一般写0。

返回值

创建错误返回 -1
创建成功返回索引号

2.blind()

接口原型 blind

int
lwip_bind(int s, const struct sockaddr *name, socklen_t namelen)

函数作用:

将sockaddr结构体中描述的一些属性(IP地址、端口号、地址簇)与socket套接字绑定,也叫给套接字命名。

函数入参:

int s :socket()返回文件描述符代表的套接字
const struct sockaddr *name:存放了服务端用于通信的地址和端口。
sockaddr结构体如下所示:

struct sockaddr {
  u8_t sa_len;
  u8_t sa_family;
  char sa_data[14];
};

这个参数的实际结构依赖于网络协议族,然后加上强制转换成sockaddr 类型传入API函数。比如AF_INET就会使用sockaddr_in结构体作为实际结构。
AF_INET6则会使用sockaddr_in6结构体作为实际结构。然后强制转换为const struct sockaddr *name解决编译上的警告报错。

socklen_t namelen
前一参数结构体的长度。

返回值

成功返回0;
出错返回-1;错误原因保存在errno 中。(一般是地址绑定错误、端口已被占用)

3.listen()

接口原型

int
lwip_listen(int s, int backlog)

函数作用:

listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。

函数入参:

int s :socket()返回文件描述符代表的套接字
backlog:监听队列的长度,当连接数量>这个值,客户端的请求连接会被拒绝

返回值

成功返回0;
出错返回-1;

4.accept()

接口原型

int
lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen)

函数作用:

提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符。一般用于服务器中阻塞进程,等待客户端连接。

函数入参:

与上方blind()的入参一致这里不再赘述。

返回值

返回指向该套接字的文件描述符。
失败返回:-1;错误原因保存在errno 中。

5.connect()

接口原型

int
lwip_connect(int s, const struct sockaddr *name, socklen_t namelen)

函数作用:

用于建立与指定socket的连接。一般用于客户端,

函数入参:

与上方blind()的入参一致这里不再赘述。

返回值

成功返回:0
失败返回:-1;错误原因保存在errno 中。

6.读 /写read()/write()、recv()/send()

下面是lwip中read()write()函数源码,只是对recvfrom()send()进行了分装
read()函数定义:

int
lwip_read(int s, void *mem, size_t len)
{
  return lwip_recvfrom(s, mem, len, 0, NULL, NULL);
}

write()函数定义:

int
lwip_write(int s, const void *data, size_t size)
{
  return lwip_send(s, data, size, 0);
}

recv()函数定义:

int
lwip_recv(int s, void *mem, size_t len, int flags)
{
  return lwip_recvfrom(s, mem, len, flags, NULL, NULL);
}

send()函数定义:

int
lwip_send(int s, const void *data, size_t size, int flags)

函数入参:

int s:目标连接文件描述符代表的套接字
const void *data:发送数据的指针
void *mem:接收数据的内存地址
int flags:标志位

7.close()

接口原型

int
lwip_close(int s)

函数作用:

关闭socket连接

函数入参:

int s:文件描述符代表的套接字

返回值

成功返回:0
失败返回:-1

先简单介绍一下常见的socket的api函数,还有select()、lwip_shutdown()之后补上。之后还会详细分析一下每个api的源码。加深理解。文中有说错的地方还恳请大佬指出

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:51:44  更:2021-10-20 12:53:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:24:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码