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相关推荐

  1. 技术分享 | 微服务模式下如何高效进行API测试

    导读:微服务架构下,API 测试的最大挑战来自于庞大的测试用例数量,以及微服务之间的相互耦合.基于这种挑战,如何进行高效的API测试,选择什么样的方式就比较重要,此文主要是采用契约测试的方法来对微服务 ...

  2. lwip网络通信socket_LWIP之SOCKET的实现

    2009-05-11LWIP之SOCKET的实现 Lwip协议栈的实现目的,无非是要上层用来实现app的socket编程.好,我们就从socket开始.为了兼容性,lwip的socket应该也是提供标 ...

  3. lwip网络通信socket_LWIP之SOCKET编程

    2009-05-15 LWIP之SOCKET编程 前几天看了关于LWIP协议栈的实现和FREERTOS的基本原理.今天开始调试LWIP的socket通信,是基于freertos系统的ARM9_STR9 ...

  4. Linux Kernel TCP/IP Stack — L7 Layer — Application Socket I/O 接口类型

    目录 文章目录 目录 基本概念 同步与异步 阻塞与非阻塞 I/O 操作的执行流程 Socket I/O 接口类型 阻塞 IO 缺点 非阻塞 IO 缺点 阻塞 IO 与非阻塞 IO 的区别 IO 多路复 ...

  5. Epoll在LT和ET模式下的读写方式

    在一个非阻塞的socket上调用read/write函数,返回EAGAIN 或者 EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是:EAGAIN: 再试一次 ...

  6. epoll在ET和LT模式下读写

    在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是:EAGAIN: 再试一次, ...

  7. Oracle EBS - Forms Servlet与Socket模式比较

    Oracle EBS - Forms Servlet与Socket模式比较 =====Servlet模式===== R12默认使用Servlet模式;  Servlet基于HTTP/HTTPS,不需要 ...

  8. 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. ...

  9. socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)

    socket的阻塞模式和非阻塞模式 无论是Windows还是Linux,默认创建socket都是阻塞模式的 在Linux中,可以再创建socket是直接将它设置为非阻塞模式 int socket (i ...

最新文章

  1. 卷积神经网络的一些规则
  2. Swift UIAlertView 的使用
  3. CentOS 8中安装Docker出现和Podman冲突
  4. 基于Python技术栈的算法落地踩坑
  5. C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序...
  6. JAVA多线程,真的能提高效率吗
  7. 贝叶斯线性回归方法的解释和优点
  8. zookeeper专题:使用zookeeper实现分布式锁
  9. 斯坦福 CS183 YC 创业课系列中文笔记
  10. MSP430F5529-基于ATK-IMU901角度传感器在UART的串口通信于数据显示
  11. 爬虫入门 手写一个Java爬虫
  12. fx5u模拟量如何读取_三菱FX5U PLC内置模拟量输入为电流怎么设置?
  13. 基于微信小程序的爱生活爱乐餐订餐外卖系统#毕业设计
  14. 那些有趣的网站系列(十)
  15. 微机原理与接口技术重要的知识点
  16. 分布式ID之snowflake
  17. 熬夜整理小米Java面试题,已拿offer
  18. win7系统怎样搭建电影服务器,用Win7系统来制作电影我们都能当导演
  19. java swing多人聊天室_使用java swing和socket编程实现简单的多人聊天室-Go语言中文社区...
  20. 【狮子数学】chapter2-02-中值定理

热门文章

  1. enumerate_Java Thread类的static int enumerate(Thread [] th)方法与示例
  2. vb.net axWindowsMediaPlayer 控件使用
  3. CentOS 8安装并配置NFS服务
  4. Jedis使用测试——连接本地及远程的Redis
  5. 计算机专业410分能上哪些大学,2021年高考410分能报什么学校
  6. linux挂载硬盘的分区创建,Linux 新增硬盘、新建分区、格式化硬盘、挂载硬盘的操作...
  7. linux 查看neihe版本_linux查看系统内核版本号
  8. 时分秒 java_JAVA 时分秒累加
  9. Java2精要_java知识精要(一)
  10. 爱奇艺怎么看不了电视剧和视频