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的。
lwip网络通信socket_lwIP在Socket模式下接口:BSD Socket API相关推荐
- 技术分享 | 微服务模式下如何高效进行API测试
导读:微服务架构下,API 测试的最大挑战来自于庞大的测试用例数量,以及微服务之间的相互耦合.基于这种挑战,如何进行高效的API测试,选择什么样的方式就比较重要,此文主要是采用契约测试的方法来对微服务 ...
- lwip网络通信socket_LWIP之SOCKET的实现
2009-05-11LWIP之SOCKET的实现 Lwip协议栈的实现目的,无非是要上层用来实现app的socket编程.好,我们就从socket开始.为了兼容性,lwip的socket应该也是提供标 ...
- lwip网络通信socket_LWIP之SOCKET编程
2009-05-15 LWIP之SOCKET编程 前几天看了关于LWIP协议栈的实现和FREERTOS的基本原理.今天开始调试LWIP的socket通信,是基于freertos系统的ARM9_STR9 ...
- Linux Kernel TCP/IP Stack — L7 Layer — Application Socket I/O 接口类型
目录 文章目录 目录 基本概念 同步与异步 阻塞与非阻塞 I/O 操作的执行流程 Socket I/O 接口类型 阻塞 IO 缺点 非阻塞 IO 缺点 阻塞 IO 与非阻塞 IO 的区别 IO 多路复 ...
- Epoll在LT和ET模式下的读写方式
在一个非阻塞的socket上调用read/write函数,返回EAGAIN 或者 EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是:EAGAIN: 再试一次 ...
- epoll在ET和LT模式下读写
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是:EAGAIN: 再试一次, ...
- Oracle EBS - Forms Servlet与Socket模式比较
Oracle EBS - Forms Servlet与Socket模式比较 =====Servlet模式===== R12默认使用Servlet模式; Servlet基于HTTP/HTTPS,不需要 ...
- lwIP TCP/IP 协议栈笔记之十八: Socket接口编程
目录 1. Socket 概述 2. LwIP 中的socket 3. Socket API 3.1 socket() 3.2 bind() 3.3 connect() 3.4 listen() 3. ...
- socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)
socket的阻塞模式和非阻塞模式 无论是Windows还是Linux,默认创建socket都是阻塞模式的 在Linux中,可以再创建socket是直接将它设置为非阻塞模式 int socket (i ...
最新文章
- 卷积神经网络的一些规则
- Swift UIAlertView 的使用
- CentOS 8中安装Docker出现和Podman冲突
- 基于Python技术栈的算法落地踩坑
- C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序...
- JAVA多线程,真的能提高效率吗
- 贝叶斯线性回归方法的解释和优点
- zookeeper专题:使用zookeeper实现分布式锁
- 斯坦福 CS183 YC 创业课系列中文笔记
- MSP430F5529-基于ATK-IMU901角度传感器在UART的串口通信于数据显示
- 爬虫入门 手写一个Java爬虫
- fx5u模拟量如何读取_三菱FX5U PLC内置模拟量输入为电流怎么设置?
- 基于微信小程序的爱生活爱乐餐订餐外卖系统#毕业设计
- 那些有趣的网站系列(十)
- 微机原理与接口技术重要的知识点
- 分布式ID之snowflake
- 熬夜整理小米Java面试题,已拿offer
- win7系统怎样搭建电影服务器,用Win7系统来制作电影我们都能当导演
- java swing多人聊天室_使用java swing和socket编程实现简单的多人聊天室-Go语言中文社区...
- 【狮子数学】chapter2-02-中值定理
热门文章
- enumerate_Java Thread类的static int enumerate(Thread [] th)方法与示例
- vb.net axWindowsMediaPlayer 控件使用
- CentOS 8安装并配置NFS服务
- Jedis使用测试——连接本地及远程的Redis
- 计算机专业410分能上哪些大学,2021年高考410分能报什么学校
- linux挂载硬盘的分区创建,Linux 新增硬盘、新建分区、格式化硬盘、挂载硬盘的操作...
- linux 查看neihe版本_linux查看系统内核版本号
- 时分秒 java_JAVA 时分秒累加
- Java2精要_java知识精要(一)
- 爱奇艺怎么看不了电视剧和视频