2024年3月11日发(作者:)

,.

LWIP之SOCKET的实现

/214870/158413

Lwip协议栈的实现目的,无非是要上层用来实现app的socket编程。好,我

们就从socket开始。为了兼容性,lwip的socket应该也是提供标准的socket接口

函数,恩,没错,在srcincludelwipsocket.h文件中可以看到下面的宏定义:

#if LWIP_COMPAT_SOCKETS

#define accept(a,b,c) lwip_accept(a,b,c)

#define bind(a,b,c) lwip_bind(a,b,c)

#define shutdown(a,b) lwip_shutdown(a,b)

#define closesocket(s) lwip_close(s)

#define connect(a,b,c) lwip_connect(a,b,c)

#define getsockname(a,b,c) lwip_getsockname(a,b,c)

#define getpeername(a,b,c) lwip_getpeername(a,b,c)

#define setsockopt(a,b,c,d,e) lwip_setsockopt(a,b,c,d,e)

#define getsockopt(a,b,c,d,e) lwip_getsockopt(a,b,c,d,e)

#define listen(a,b) lwip_listen(a,b)

#define recv(a,b,c,d) lwip_recv(a,b,c,d)

#define recvfrom(a,b,c,d,e,f) lwip_recvfrom(a,b,c,d,e,f)

#define send(a,b,c,d) lwip_send(a,b,c,d)

#define sendto(a,b,c,d,e,f) lwip_sendto(a,b,c,d,e,f)

#define socket(a,b,c) lwip_socket(a,b,c)

#define select(a,b,c,d,e) lwip_select(a,b,c,d,e)

,.

#define ioctlsocket(a,b,c) lwip_ioctl(a,b,c)

#if LWIP_POSIX_SOCKETS_IO_NAMES

#define read(a,b,c) lwip_read(a,b,c)

#define write(a,b,c) lwip_write(a,b,c)

#define close(s) lwip_close(s)

先不说实际的实现函数,光看这些定义的宏,就是标准socket所必须有的接口。

接着看这些实际的函数实现。这些函数实现在srcapisocket.c中。先看下接受

连接的函数,这个是tcp的

原型:int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen)

可以看到这里的socket类型参数 s,实际上是个int型

在这个函数中的第一个函数调用是sock = get_socket(s);

这里的sock变量类型是lwip_socket,定义如下:

/** Contains all internal pointers and states used for a socket */

struct lwip_socket {

/** sockets currently are built on netconns, each socket has one netconn */

struct netconn *conn;

/** data that was left from the previous read */

struct netbuf *lastdata;

/** offset in the data that was left from the previous read */

u16_t lastoffset;

/** number of times data was received, set by event_callback(),