更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
sockets.h 文件参考

浏览源代码.

函数

int closesocket (int sockfd)
 
int socks_poll (int sockfd, poll_table *wait)
 
int socks_ioctl (int sockfd, long cmd, void *argp)
 
int socks_close (int sockfd)
 
void socks_refer (int sockfd)
 

函数说明

◆ closesocket()

int closesocket ( int  s)
closesocket 一个套接字的默认行为是把套接字标记为已关闭,然后立即返回到调用进程,
该套接字描述符不能再由调用进程使用,也就是说它不能再作为read或write的第一个参数,
然而TCP将尝试发送已排队等待发送到对端,发送完毕后发生的是正常的TCP连接终止序列。 
在多进程并发服务器中,父子进程共享着套接字,套接字描述符引用计数记录着共享着的进程个数,
当父进程或某一子进程close掉套接字时,描述符引用计数会相应的减一,
当引用计数仍大于零时,这个close调用就不会引发TCP的四路握手断连过程。
 * 
参数
s
返回
int

在文件 socket.c166 行定义.

167{
168 return lwip_close(s);
169}
这是这个函数的调用关系图:

◆ socks_close()

int socks_close ( int  sockfd)

在文件 sockets.c1631 行定义.

1632{
1633 struct lwip_sock *sock = NULL;
1634 SYS_ARCH_DECL_PROTECT(lev);
1635
1636 sock = get_socket(sockfd);
1637 if (!sock) {
1638 return -1;
1639 }
1640
1641 SYS_ARCH_PROTECT(lev);
1642
1643 if (sock->s_refcount == 0) {
1644 SYS_ARCH_UNPROTECT(lev);
1645 done_socket(sock);
1646 return lwip_close(sockfd);
1647 }
1648
1649 sock->s_refcount--;
1650
1651 SYS_ARCH_UNPROTECT(lev);
1652 done_socket(sock);
1653 return 0;
1654}
这是这个函数的调用关系图:

◆ socks_ioctl()

int socks_ioctl ( int  sockfd,
long  cmd,
void argp 
)

在文件 sockets.c1543 行定义.

1544{
1545 void *argpbak = argp;
1546 int ret;
1547 size_t nbytes = 0;
1548
1549 if (LOS_IsUserAddress((VADDR_T)(uintptr_t)argp)) {
1550 switch (cmd) {
1551 case FIONREAD:
1552 case FIONBIO:
1553 nbytes = sizeof(int);
1554 break;
1555 case SIOCADDRT:
1556 nbytes = sizeof(struct rtentry);
1557 break;
1558 case SIOCGIFCONF:
1559 return do_ioctl_SIOCGIFCONF(sockfd, cmd, argp);
1560 case SIOCSIPV6DAD:
1561 case SIOCGIPV6DAD:
1562 case SIOCSIPV6DPCTD:
1563 case SIOCGIPV6DPCTD:
1564 case SIOCGIFADDR:
1565 case SIOCSIFADDR:
1566 case SIOCDIFADDR:
1567 case SIOCGIFNETMASK:
1568 case SIOCSIFNETMASK:
1569 case SIOCSIFHWADDR:
1570 case SIOCGIFHWADDR:
1571 case SIOCSIFFLAGS:
1572 case SIOCGIFFLAGS:
1573 case SIOCGIFNAME:
1574 case SIOCSIFNAME:
1575 case SIOCGIFINDEX:
1576 case SIOCGIFMTU:
1577 case SIOCSIFMTU:
1578 case SIOCETHTOOL:
1579 case SIOCGIFBRDADDR:
1580 nbytes = sizeof(struct ifreq);
1581 break;
1582 default:
1583 nbytes = 0;
1584 }
1585 if (argp != NULL && nbytes > 0) {
1586 argp = malloc(nbytes);
1587 if (argp == NULL) {
1588 set_errno(ENOMEM);
1589 return -1;
1590 }
1591 if (LOS_ArchCopyFromUser(argp, argpbak, nbytes) != 0) {
1592 free(argp);
1593 set_errno(EFAULT);
1594 return -1;
1595 }
1596 }
1597 }
1598 ret = lwip_ioctl(sockfd, cmd, argp);
1599 if (ret == 0 && argp != argpbak) {
1600 if (LOS_ArchCopyToUser(argpbak, argp, nbytes) != 0) {
1601 /* how to rollback ioctl ? */
1602 set_errno(EFAULT);
1603 ret = -1;
1604 }
1605 }
1606 if (argp != argpbak) {
1607 free(argp);
1608 }
1609 return ret;
1610}
unsigned long VADDR_T
Definition: los_typedef.h:208
STATIC INLINE BOOL LOS_IsUserAddress(VADDR_T vaddr)
虚拟地址是否在用户空间
Definition: los_vm_map.h:275
void * malloc(size_t size)
动态分配内存块大小
Definition: malloc.c:81
void free(void *ptr)
释放ptr所指向的内存空间
Definition: malloc.c:66
static int do_ioctl_SIOCGIFCONF(int sockfd, long cmd, void *argp)
Definition: sockets.c:1498
ARG_NUM_3 int
size_t LOS_ArchCopyToUser(void *dst, const void *src, size_t len)
从内核空间拷贝到用户空间
Definition: user_copy.c:79
size_t LOS_ArchCopyFromUser(void *dst, const void *src, size_t len)
Definition: user_copy.c:58
函数调用图:

◆ socks_poll()

int socks_poll ( int  sockfd,
poll_table *  wait 
)

在文件 sockets.c297 行定义.

298{
299 int ret;
300 pollevent_t mask = 0;
301 struct lwip_sock *sock;
302 SYS_ARCH_DECL_PROTECT(lev);
303
304 LWIP_ERROR("sock_poll: invalid poll_table", (wait != NULL), return -EINVAL;);
305
306 sock = get_socket(s);
307 if (!sock) {
308 LWIP_DEBUGF(SOCKETS_DEBUG, ("sock_poll: Invalid socket"));
309 set_errno(EBADF);
310 return -EBADF; /* compatible with file poll */
311 }
312
313 SYS_ARCH_PROTECT(lev);
314
315 mask |= (sock->rcvevent > 0 || sock->lastdata.pbuf) ? (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND) : 0;
316 mask |= (sock->sendevent != 0) ? (POLLOUT | POLLWRNORM | POLLWRBAND) : 0;
317 mask |= (sock->errevent != 0) ? (POLLERR) : 0;
318
319 SYS_ARCH_UNPROTECT(lev);
320
321 ret = wait->key & mask;
322 if (!ret) {
323 poll_wait(NULL, &sock->wq, wait);
324 }
325
326 done_socket(sock);
327 return ret;
328}
void poll_wait(struct file *filp, wait_queue_head_t *wait_address, poll_table *p)
函数调用图:

◆ socks_refer()

void socks_refer ( int  sockfd)

在文件 sockets.c1612 行定义.

1613{
1614 struct lwip_sock *sock = NULL;
1615 SYS_ARCH_DECL_PROTECT(lev);
1616
1617 sock = get_socket(sockfd);
1618 if (!sock) {
1619 return;
1620 }
1621
1622 SYS_ARCH_PROTECT(lev);
1623
1624 sock->s_refcount++;
1625
1626 SYS_ARCH_UNPROTECT(lev);
1627
1628 done_socket(sock);
1629}
这是这个函数的调用关系图: