LWIP 代码示例

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;
以下是一个使用C语言实现lwIP mDNS的示例代码: ```c #include "lwip/init.h" #include "lwip/netif.h" #include "lwip/dns.h" #include "lwip/mdns.h" void mdns_init() { struct netif* netif; ip_addr_t addr; // 初始化lwIPlwip_init(); // 添加网络接口(根据需要修改接口名称) netif = netif_add(NULL, NULL, NULL, NULL, NULL, NULL); // 设置网络接口的IP地址 IP4_ADDR(&addr, 192, 168, 1, 10); netif_set_ipaddr(netif, &addr); netif_set_up(netif); // 启动mDNS服务 mdns_resp_init(); mdns_resp_add_netif(netif, "mydevice"); // 设置mDNS服务的网络接口和设备名称 mdns_resp_announce(netif); // 发送mDNS通告 // 在此处添加其他的网络服务初始化代码,如HTTP服务器、FTP服务器等 } int main() { // 初始化mDNS mdns_init(); // 进入主循环 while(1) { // 在此处添加主循环处理代码 // 处理网络任务 sys_check_timeouts(); } return 0; } ``` 这段示例代码通过lwIP库实现了mDNS服务。首先,需要调用lwip_init()函数初始化lwIP库。然后,添加网络接口并设置IP地址。接下来,调用mdns_resp_init()函数初始化mDNS响应器,并通过mdns_resp_add_netif()函数将网络接口和设备名称添加到mDNS响应器中。最后,调用mdns_resp_announce()函数发送mDNS通告。 在主循环中,可以添加其他的网络任务处理代码。通过调用sys_check_timeouts()函数处理lwIP库的定时任务。 请根据你的实际需求修改示例代码中的网络接口和设备名称等参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菠萝地亚狂想曲

送我一瓶农夫山泉?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值