LWIP 代码示例
创始人
2024-11-11 17:10:51
0次

目录

  • API
  • 流程
  • sockaddr_in 初始化
  • 示例

API

推荐在Socket层面的API,一共只有如下这么多:
#include “socket.h”

int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen); int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen); int lwip_shutdown(int s, int how); int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen); int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen); int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen); int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen);  int lwip_close(int s); int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen); int lwip_listen(int s, int backlog); ssize_t lwip_recv(int s, void *mem, size_t len, int flags); ssize_t lwip_read(int s, void *mem, size_t len); ssize_t lwip_readv(int s, const struct iovec *iov, int iovcnt); ssize_t lwip_recvfrom(int s, void *mem, size_t len, int flags,       struct sockaddr *from, socklen_t *fromlen); ssize_t lwip_recvmsg(int s, struct msghdr *message, int flags); ssize_t lwip_send(int s, const void *dataptr, size_t size, int flags); ssize_t lwip_sendmsg(int s, const struct msghdr *message, int flags); ssize_t lwip_sendto(int s, const void *dataptr, size_t size, int flags,     const struct sockaddr *to, socklen_t tolen); int lwip_socket(int domain, int type, int protocol); ssize_t lwip_write(int s, const void *dataptr, size_t size); ssize_t lwip_writev(int s, const struct iovec *iov, int iovcnt); #if LWIP_SOCKET_SELECT int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,                 struct timeval *timeout); #endif #if LWIP_SOCKET_POLL int lwip_poll(struct pollfd *fds, nfds_t nfds, int timeout); #endif int lwip_ioctl(int s, long cmd, void *argp); int lwip_fcntl(int s, int cmd, int val); const char *lwip_inet_ntop(int af, const void *src, char *dst, socklen_t size); int lwip_inet_pton(int af, const char *src, void *dst); 

流程

如果做client,操作流程如下

API功能描述
server_fd = lwip_socket( )新建socket描述符
lwip_connect( server_addr )连接服务器
lwip_read( server_fd )接收数据
lwip_write( server_fd )发送数据

如果做server,操作流程如下

API功能描述
server_fd = lwip_socket( )新建socket描述符
lwip_bind( server_fd, server_addr )分配套接字地址
lwip_listen( server_fd )等待连接请求状态
lwip_accept( server_fd, client_addr )允许连接
lwip_read( client_addr )接收数据
lwip_write( client_addr)发送数据
lwip_recvfrom( client_addr )接收数据,可以获取到接收数据是谁发出的

sockaddr_in 初始化

struct sockaddr_in {   u8_t            sin_len;   sa_family_t     sin_family;   in_port_t       sin_port;   struct in_addr  sin_addr; #define SIN_ZERO_LEN 8   char            sin_zero[SIN_ZERO_LEN]; }; 
参数意义初始化实例
sin_family协议族server_addr.sin_family = AF_INET;
sin_port端口号server_addr.sin_port = htons(49850);
htons( ):16位数据字节交换
sin_addrIP地址server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_addr.s_addr = inet_addr(“192.168.0.5”);
INADDR_ANY:000000000,代表所有网卡
htonl( ):32位数据字节交换
inet_addr( ):字符串IP地址转网络序IP地址
其他参数全部清零

示例

TCP server send

int ret;                          //保存lwip api返回值,一般来说不是-1就没问题   int server_fd;                    //保存socket描述符,由lwip_socket返回,如果是-1那么描述符分配失败   struct sockaddr_in server_addr;   //保存socket相应的地址和端口号   int client_fd = 0;   struct sockaddr_in client_addr;   //保存socket相应的地址和端口号   uint32_t client_addr_sz = 0; restart:   server_fd = lwip_socket(AF_INET, SOCK_STREAM, IPPROTO_IP); //IPV4,TCP,IP   PROJ_ASSERT(server_fd != -1);   memset(&server_addr, 0, sizeof(struct sockaddr_in));   server_addr.sin_family = AF_INET;                      //IPV4   server_addr.sin_port = htons(49850);                   //htons用于交换port高低字节   server_addr.sin_addr.s_addr = htonl(INADDR_ANY);       //htonl用于交换s_addr高低字节    osDelay(10);   ret = lwip_bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));   if(ret == -1)goto err;    ret = lwip_listen(server_fd, 0);   if(ret == -1)goto err;  reaccept:   client_fd = lwip_accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_sz);   PROJ_ASSERT(client_fd != -1);    for(;;)   {      ret = lwip_write(client_fd, "hello from lwip_func\n", sizeof("hello from lwip_func\n"));     if(ret == -1)     {       lwip_close(client_fd);       goto reaccept;     }     osDelay(100);   } err:     lwip_close(server_fd);     goto restart; 

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...