lwip网络通信socket_lwIP在Socket模式下接口:BSD Socket API

http://home.eeworld.com.cn/my/space-uid-162102-blogid-52270.html

2011

原文:

关于BSD Socket API

在网上找到的两个网站,是关于BSD Sockets API的,这是与lwIP在Socket模式下兼容的。里面对API函数做了较为详细的介绍,先记下来,有空翻译一下

-------------------------------------------------------------------------------------

最常用的BSD API函数:

socket:创建一个插口(socket)

bind:将本地端口号和IP地址绑定到插口上

listen:TCP监听

accept:TCP监听接受处理

connect:TCP客户端连接

select:特殊插口设置

send/sendto:发送数据包到已连接/未连接插口上

recv/recvfrom:接收数据包从已连接/未连接插口上

getsockopt/setsockopt:获取/改变插口选项

getpeername/getsockname:获取远端/本地地址信息

close:关闭插口

shutdown:按设置关闭插口

gethostbyname/gethostbyaddr:地址域名映射

read:从插口缓存读数据

write:想插口缓存写数据

-------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------

#include

#include

int socket( int domain, int type, int protocol );

创建通讯用的“插口”(插口socket可以理解为IP地址和端口号组合成的地址),创建成功返回插口ID(出错返回-1)。

参数:domain协议族(AF_UNIX是UNIX,AF_INET是IPv4协议,AF_ROUTE是路由器协议);type类型(SOCK_STREAM是TCP,SOCK_DGRAM是UDP,SOCK_RAW是RAM活IPv4);protocol为0。

该函数返回大于等于0的整数作为插口ID,如果出错返回-1

-------------------------------------------------------------------------------------

#include #include

int bind ( int sockFd, const struct sockaddr *sockAddr, int addrLen );

将插口名、本地端口号和本地IP地址绑定到指定插口上。一般在用作服务器时使用该函数。返回0成功,-1未成功。

参数:sockFd插口ID,由socket函数创建;sockAddr结构体包含插口地址信息,AF_UNIX用下面结构体

struct sockaddr {

unsigned short sa_family;     // Address Family (domain)

char           sa_data[14]]; // Protocol Address

};

AF_INET用下面的结构体,使用前需初始化,下面使用TCP函数时相同。

struct sockaddr_in {

short          sin_family;    // Address Family

unsigned short sin_port;      // Port Number

struct in_addr sin_addr;      // Internet Address

unsigned char sin_zero[8];   // Pad structure

};

addrLen是上述结构体长度。

-------------------------------------------------------------------------------------

#include

int listen( int sockFd, int backlog );

TCP服务器监听指定插口

参数:sockFd已创建并被绑定的插口;backlog允许接收的客服端数量。

-------------------------------------------------------------------------------------

include

#include

int accept ( int sockFd, struct sockaddr *clientAddr, int *addrLen )

TCP服务器监听到连接时的响应函数。

参数:sockFd已创建、绑定并监听的插口;clientAddr远端连接信息;addrLen结构体长度。

-------------------------------------------------------------------------------------

#include

#include

int connect ( int sockFd, struct sockaddr *servAddr, int addrLen );

TCP/UDP客服端申请TCP/UDP服务器的链接。

参数:sockFd已创建的插口;servAddr服务器连接信息;addrLen结构体长度。

返回0成功,-1出错

-------------------------------------------------------------------------------------

#include

#include

#include

int select( int n, fd_set *read_fds, fd_set *write_fds,

fd_set *exceptfds, struct timeval *timeout );

挂起当前线程,等待特定事件发生或定时器过期。本函数可以指定4类特定事件:read、write、exception和超时。返回插口ID表示事件有响应,0表示超时,-1表示出错。

参数:n应该大于所有插口ID,用FD_SETSIZE代替;后面三个fd_set结构体存储三种插口事件位图:

typedef struct fd_set {

fd_mask fds_bits[(FD_SETSIZE + NFDBITS - 1) / NFDBITS];

} fd_set;

用以下四个宏修改:

FD_SET(fd, fdset) fd插口ID,fdset是fd_set结构体地址,设置插口事件为真

FD_CLR(fd, fdset)设置插口事件为假

FD_ISSET(fd, fdset)获取插口状态,是否设置

FD_ZERO(fdset)清除所有设置

第四个参数timeval结构体如下:

struct timeval {

int tv_sec;      /* 秒 */

int tv_usec;     /* 毫秒 */

};

用来设置超时时间。

-------------------------------------------------------------------------------------

#include

#include

int send ( int sockFd, const void *msg, int msgLen, unsigned int flags);

int sendto ( int sockFd, const void *msg, int msgLen, unsigned int flags,

const struct sockaddr *to, int toLen);

这两个函数都用来按插口发送数据包,send用在已经连接的插口,sendto用在没有连接上的插口。

send函数的参数:sockFD插口ID,msg要发送的数据指针,msgLen要发送的数据长度,flags发送选项(按位)

sendto函数的参数:UDP专用,插口必须是SOCK_DGRAM类型。由于没有连接,所以sendto函数增加了两个与连接有关的参数。to定义目标地址的结构体,toLen是结构体长度。sockaddr结构体如下:

struct sockaddr {

u_short sa_family;

char sa_data[14];

};

这两个函数返回值均为实际发送字节的长度(软件需要调整偏移量将数据全部发送),-1表示发送不成功。

-------------------------------------------------------------------------------------

#include

#include

int recv ( int sockFd, const void *msg, int msgLen, unsigned int flags);

int recvfrom ( int sockFd, const void *msg, int msgLen, unsigned int flags,

const struct sockaddr *from, int *fromLen);

这两个函数均是按插口来接收数据包,recv函数用在已连接插口上,recvfrom用在未连接插口上。

recv函数参数:sockFd插口ID,msg接收缓存地址,msgLen接收缓存最大空间,flags接收选项。

recvfrom函数参数:UDP专用,插口必须是SOCK_DRAM类型。由于没有连接,所以recvfrom函数增加了两个与连接有关的参数。from定义目标地址的结构体,formLen是结构体长度。

两个函数均返回接收到的数据数,-1接收错误,0表示目标地址已经传输完毕并关闭连接。

-------------------------------------------------------------------------------------#include

#include

int setsockopt ( int sd, int level, int optname, const void *optval, socklen_t optlen);

int getsockopt ( int sd, int level, int optname, void *optval, socklen_t *optlen );setsockopt函数用来改变插口的模式,这种改变是通过修改插口选项实现的。getsockopt函数用来获取插口选项的值。参数:sd插口ID;level协议栈选项,包括SOL_SOCKET(插口层)、IPPROTO_TCP(TCP层)和IPPROTO_IP(IP层);optname需要修改的选项名;optval修改值地址;optlen修改值长度。返回0表示成功。-------------------------------------------------------------------------------------#include int getsockname ( int sd, struct sockaddr *addr, int *addrLen );int getpeername ( int sd, struct sockaddr *addr, int *addrLen );getsockname函数用于从已连接的插口中获取本地地址信息。getpeername函数用于获取远端地址信息。参数:sd插口ID;addr地址信息结构体;addrLen结构体长度。返回0成功,-1错误-------------------------------------------------------------------------------------#include int close ( int sd );关闭插口通信(丢弃未发送的数据包并拒绝接受数据)-------------------------------------------------------------------------------------#include int shutdown ( int sockFd, int how );该函数提供了更大的权限控制插口的关闭过程。参数:sockFd插口ID;how仅能为0、1和2这三个值0表示停止接收当前数据并拒绝以后的数据接收1表示停驶发送数据并丢弃未发送的数据2是0和1的合集-------------------------------------------------------------------------------------intread(int sockFD, void *buffer, UInt32 numBytes);从指定插口中等待数据接收并存放到buffer中。该函数会挂起线程,直到有数据接收到。参数:sockFd插口ID;buffer缓存地址;numBytes缓冲大小该函数返回接收到的数据大小,-1表示出错,0表示远端已经关闭连接。-------------------------------------------------------------------------------------int write(int sockFD, void *buffer, UInt32 numBytes);将缓存中数据写到指定插口准备发送。参数:sockFd插口ID;buffer缓存地址;numBytes缓存中数据大小该函数返回实际发送的数据量,-1表示出错。-------------------------------------------------------------------------------------补充:lwIP协议栈在socket模式下也就是操作系统中运行,创建进程的方式与操作系统中创建进程的方式有所不同。要用专用函数:sys_thread_t sys_thread_new(char *name, void(* thread)(void *arg), void *arg, int stacksize, int prio)参数:name线程说明;thread线程函数;arg线程函数的参数;stacksize线程堆栈大小;prio线程优先级在lwIP下创建线程统一使用此函数,当然这个函数也是要调用系统创建线程的API的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idal 创建springboot 项目_SpringBoot教程:Maven方式创建SpringBoot项目

一.Maven方式创建Spring Boot项目1.配置Maven环境在以maven方式创建Spring Boot项目之前,请先确保自己的Maven并配置好环境变量,并且在ideal中关联好maven环境。2.创建一个新的maven项目3.设置项目坐标信息到此为止,就已经成功的…

mysql xa_Mysql对XA的支持

mysql8.0文档:https://dev.mysql.com/doc/refman/8.0/en/xa-statements.html。13.3.8.1 XA Transaction SQL Syntax章节讲述了Mysql对于XA事务的语法。XA {START|BEGIN} xid [JOIN|RESUME] XA END xid [SUSPEND [FOR MIGRATE]] XA PREPARE xid XA COMMIT xid [ONE P…

mysql创建新的表_Mysql 创建表

Mysql 创建表1.首先打开终端输入如下命令:/usr/local/MySQL/bin/mysql -u root -p其中root为用户名。2.这时会出现如下命令:Enter password:此时如果你没有改密码,直接敲回车。否则,输入你的密码。这样就可以访问你的数据库服务器…

mysql gfs2_Mysql_HA+IP_SAN+Clvmd+GFS2

Mysql_HAIP_SANClvmdGFS2GFS:全局文件系统,支持DLM锁管理,支持并发写,Centos6不超过16个节点适用于HA集群使用的共享存储适用于LB集群RealServer使用的共享存储mysql高可用集群架构设计1、节点主机系统:Centos6.52、高…

mysql 使用sum limit_mysql踩坑记录之limit和sum函数混合使用问题

问题复盘本次复盘会用一个很简单的订单表作为示例。数据准备订单表建表语句如下(这里偷懒了,使用了自增ID,实际开发中不建议使用自增ID作为订单ID)CREATE TABLE order (id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘订单ID‘,amount decimal(10,2) NOT…

mysql 视图 过程 函数_MySQL视图,函数,触发器,存储过程

1. 视图视图是一个虚拟表,它的本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。使用视图我们可以把查询过程中的临时表摘出来,用视图去实现&…

ubuntu安装mysql5.7.17_ubuntu 16.04安装mysql-server_5.7.17

在MySQL官网上下载最新版的Ubuntu Linux专用的MySQL。我这里下载的是:mysql-server_5.7.17-1ubuntu16.04_amd64.deb-bundle.tar也可从以下mirrors下载:解压文件 命令为:rootubuntu:/# tar -zxvf mysql-server_5.7.17-1ubuntu16.04_amd64.deb-…

socket抓包_64、抓包分析tcp与udp

从前面的两个案例,我们了解到了如何通过原生socket函数分别创建tcp和udp服务,以及通过相应的客户端进行连接测试。在本文中,我们将继续深入地去了解tcp和udp的差别,和思考它们两者如何应该多个客户端请求1、抓包分析这里采用tcpdu…

c#水晶报表连接mysql,如何将数据库绑定到水晶报表?

i have C# program, i have DataSet that i want to bind to crystal report.how to do it ?解决方案Create a Typed DataSet from the "Add New Item > DataSet and give the dataseta useful name.In Server Explorer, drag a view with the fields you want in the…

fw313r手机登录_迅捷(FAST)fw313r路由器手机设置教程

本文中,鸿哥主要给大家介绍,迅捷(FAST)fw313r路由器用手机设置的方法。一台新买回来的迅捷(FAST)fw313r路由器,要用手机来设置它连接Internet上网,需要以下几个步骤:1、正确连接FW313R路由器2、手机连接FW313R的信号3、…

mysql 5.6.21不能选择安装路径_mysql5.6.21服务器安装图解(选择安装和数据目录)

mysql安装图解(服务器上安装mysql,只安装mysql服务)1.3 mysql安装及配置版本:MySQL5.6.21 64位1.3.1 安装.net framework.exe 4.0注意:mysql5.6版本需要安装.net framwork.exe 4.0环境1.3.2 安装mysql数据库(1)打开安装程序后,…

mysql替换sql中rank函数_MySQL sql Rank()函数实现

一字符串类 Concat函数:连接字符串 Instr函数:返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始) 字符串大小写转换[upper()、ucase()和lower()、lcase()] upper()和ucase():把字符串中的小…

python决策树生成规则_ID3决策树(python实现)

决策树的生成(该函数是一个递归的过程)CreateTree输入:数据集、特征输出:字典型数据——决策树a、判断是否满足停止划分的条件若当前数据集的属性值为空,则投票表决当前样本中最多的类别若当前所有的样本类别相同,则返回当前数据的…

while循环python的范围_python-无法在while循环中从列表中排除一定范围内的项目

所以我发布了一个问题before,但是它过于简化了,正确地被标记为重复.我现在将更详细地发布我的问题,以便希望可以解决我的问题.简而言之如下:我有两个列表:a [10.0,20.0,25.0,40.0]和b [1.0,10.0,15.0,20.0,30.0,100.0]使用列表推导,我想从b中排除a中指…

怎么使用mysql打表_MySQL的表使用

-- 创建表CREATE TABLE teacher(id INT,NAME VARCHAR(20))-- 查看所有表SHOW TABLES;DESC student;DROP TABLE student;CREATE TABLE student(id INT,NAME VARCHAR(20),gender VARCHAR(2),age INT)-- ********一、增删改数据********* ----- 1.1 增加数据-- 插入所有字段。一定…

表级锁的mysql读写_Mysql的表级锁

我们首先需要知道的一个大前提是:mysql的锁是由具体的存储引擎实现的。所以像Mysql的默认引擎MyISAM和第三方插件引擎 InnoDB的锁实现机制是有区别的。可根据不同的场景选用不同的锁定机制。Mysql有三种级别的锁定:表级锁定、页级锁定、行级锁定一、定义…

account表里有什么 银行_模拟一个银行账户类Account,账户类中包括所有者、账号、余额、账户总数、存款、取款等信息。_学小易找答案...

【单选题】廉价磁盘冗余阵列RAID利用冗余技术实现高可靠性,其中RAID1的磁盘利用率为() 。【简答题】与直流调速相比,交流调速有何优点?【论述题】方法【单选题】以《老子注》一书驰名汉学界的学者是下列哪一位 ______【填空题】本任务中,所需的实训设备有:( )、( )、( )【单选…

创建mysql视图语法正确的是_MySQL创建视图的语法格式

视图,具有简化查询语句、安全性和保证逻辑数据独立性等作用创建视图的语法格式视图中,包含SELECT查询的结果,因此,视图的创建基于SELECT语句,和已经存在的数据表,视图可以建立在一张表上,也可以…

爬空气质量MySQL_爬虫:利用selenium采集某某环境网站的空气质量数据

前言:在上一篇文章中,我们介绍了在http://PM2.5.in这个网站采集空气质量的数据,本篇文章是对其产生的一些问题的另一种解决方案,提供更加权威的数据采集。技术框架:selenium、json、etree这里的selenium是一种自动化测…

mysql导出数据意义_11、mysql导出数据

1、使用select... into outfile语句导出数据(1)txt格式select *from runoob.tb1 into outfile /tmp/runoob.txt;(2)CSV格式select * from passwd into outfile /tmp/runoob.txt fields terminated by , enclosed by " lines terminated by \r\n;(3)生成一种文件&#xff0…