LWIP学习之Socket (API篇)

news/2024/5/18 14:09:27 标签: socket, 网络通信, api, udp, tcp/ip

Socket接口编程

  • Socket API
    • 1.Socket()
      • 函数作用:
      • 函数入参:
      • 返回值
    • 2.blind()
      • 函数作用:
      • 函数入参:
      • 返回值
    • 3.listen()
      • 函数作用:
      • 函数入参:
      • 返回值
    • 4.accept()
      • 函数作用:
      • 函数入参:
      • 返回值
    • 5.connect()
      • 函数作用:
      • 函数入参:
      • 返回值
    • 6.读 /写read()/write()、recv()/send()
      • 函数入参:
    • 7.close()
      • 函数作用:
      • 函数入参:
      • 返回值

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 ssocket()返回文件描述符代表的套接字
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 ssocket()返回文件描述符代表的套接字
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的源码。加深理解。文中有说错的地方还恳请大佬指出


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

相关文章

LWIP学习之Socket(应用篇)

单连接TCP/IP通信客户端和服务器流程图代码分析:服务器客户端单连接TCP/IP通信 客户端和服务器流程图 其流程图就像打客服电话一样,服务器可以理解成中国移动客服电话一样,我们便是客户端。 服务器就需要使用Socket()…

客户端-服务器模型

客户端服务器模型重复型:并发型:大部分网络应用程序在编写的时候都是假设一个客户端,一个是服务器。服务器是为客户端提供特定的服务。可分为重复型和并发型。 重复型: 第一步 等待一个客户端请求 第二步 处理客户端请求 第三步…

计算机网络——常用名词(IP网际协议)

IP:网际协议 常用名词 名称含义不可靠不能保证IP数据报能成功到达目的地无连接IP并不维护任何关于后续数据报的状态信息IP首部IP数据报头FTP文件传输协议SMTP电子邮件传输的协议DNS域名解析ICMPInternet控制报文协议SNMP简单网络管理协议TTL)生存时间字…

计算机网络——常用名词(数据链路层)

常用名词 名称含义MTU最大传输单元路径MTU指一条因特网传输路径中,从源地址到目的地址所经过的“路径”PPP点对点协议ARP地址解析协议RARP逆地址解析CSMA/CD带冲突的载波侦听多路接入SNAP子网接入协议LLC逻辑链路控制DSAP目的服务访问点SLIP串行线路IP MTU最大传输单元 以太网…

vcs import src < ros2.repos失败

网上找到的ros安装教程&#xff1a; 但是运行到下面几部的时候出现了问题 1. mkdir -p ~/ros2_ws/src2. cd ~/ros2_ws3. wget https://raw.githubusercontent.com/ros2/ros2/dashing/ros2.repos4. vcs import src < ros2.repos第三步报错&#xff1a;和网络有关系&#xff0…

C/C++内存分区(二)

内存分区模型 C/C将内存大方向分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理。全局区&#xff1a;存放全局变量和静态变量以及常量。栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值/局部变量等。堆区&#xff1a…

pip使用镜像网站解决网速慢

原因 pip安装库默认会访问国外服务器 解决方法 使用国内镜像网站 pip3 install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple-i&#xff1a;指定镜像源 镜像源 中国科学技术大学 : https://pypi.mirrors.ustc.edu.cn/simple 豆瓣&#xff1a;http://pypi.douban.c…

rm删除文件

语法&#xff1a; rm [options] name...参数&#xff1a; -i 删除前逐一询问确认。-f 即使原档案属性设为唯读&#xff0c;亦直接删除&#xff0c;无需逐一确认。-r 将目录及以下之档案亦逐一删除 例子 删除文件夹abc及文件夹中所有文件 rm -rf abc 出现以下提示解决办法 …