2009-05-11LWIP之SOCKET的实现
Lwip协议栈的实现目的,无非是要上层用来实现app的socket编程。好,我们就从socket开始。为了兼容性,lwip的socket应该也是提供标准的socket接口函数,恩,没错,在src\include\lwip\socket.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所必须有的接口。
接着看这些实际的函数实现。这些函数实现在src\api\socket.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(),
tested by