亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sockets.c

?? lwip-1.4.0
?? C
?? 第 1 頁 / 共 5 頁
字號:
  buf.flags = 0;#endif /* LWIP_CHECKSUM_ON_COPY */  if (to) {    inet_addr_to_ipaddr(&buf.addr, &to_in->sin_addr);    remote_port           = ntohs(to_in->sin_port);    netbuf_fromport(&buf) = remote_port;  } else {    remote_port           = 0;    ip_addr_set_any(&buf.addr);    netbuf_fromport(&buf) = 0;  }  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_sendto(%d, data=%p, short_size=%"U16_F", flags=0x%x to=",              s, data, short_size, flags));  ip_addr_debug_print(SOCKETS_DEBUG, &buf.addr);  LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", remote_port));  /* make the buffer point to the data that should be sent */#if LWIP_NETIF_TX_SINGLE_PBUF  /* Allocate a new netbuf and copy the data into it. */  if (netbuf_alloc(&buf, short_size) == NULL) {    err = ERR_MEM;  } else {#if LWIP_CHECKSUM_ON_COPY    if (sock->conn->type != NETCONN_RAW) {      u16_t chksum = LWIP_CHKSUM_COPY(buf.p->payload, data, short_size);      netbuf_set_chksum(&buf, chksum);      err = ERR_OK;    } else#endif /* LWIP_CHECKSUM_ON_COPY */    {      err = netbuf_take(&buf, data, short_size);    }  }#else /* LWIP_NETIF_TX_SINGLE_PBUF */  err = netbuf_ref(&buf, data, short_size);#endif /* LWIP_NETIF_TX_SINGLE_PBUF */  if (err == ERR_OK) {    /* send the data */    err = netconn_send(sock->conn, &buf);  }  /* deallocated the buffer */  netbuf_free(&buf);#endif /* LWIP_TCPIP_CORE_LOCKING */  sock_set_errno(sock, err_to_errno(err));  return (err == ERR_OK ? short_size : -1);}intlwip_socket(int domain, int type, int protocol){  struct netconn *conn;  int i;  LWIP_UNUSED_ARG(domain);  /* create a netconn */  switch (type) {  case SOCK_RAW:    conn = netconn_new_with_proto_and_callback(NETCONN_RAW, (u8_t)protocol, event_callback);    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_RAW, %d) = ",                                 domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));    break;  case SOCK_DGRAM:    conn = netconn_new_with_callback( (protocol == IPPROTO_UDPLITE) ?                 NETCONN_UDPLITE : NETCONN_UDP, event_callback);    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_DGRAM, %d) = ",                                 domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));    break;  case SOCK_STREAM:    conn = netconn_new_with_callback(NETCONN_TCP, event_callback);    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_STREAM, %d) = ",                                 domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));    if (conn != NULL) {      /* Prevent automatic window updates, we do this on our own! */      netconn_set_noautorecved(conn, 1);    }    break;  default:    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n",                                 domain, type, protocol));    set_errno(EINVAL);    return -1;  }  if (!conn) {    LWIP_DEBUGF(SOCKETS_DEBUG, ("-1 / ENOBUFS (could not create netconn)\n"));    set_errno(ENOBUFS);    return -1;  }  i = alloc_socket(conn, 0);  if (i == -1) {    netconn_delete(conn);    set_errno(ENFILE);    return -1;  }  conn->socket = i;  LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i));  set_errno(0);  return i;}intlwip_write(int s, const void *data, size_t size){  return lwip_send(s, data, size, 0);}/** * Go through the readset and writeset lists and see which socket of the sockets * set in the sets has events. On return, readset, writeset and exceptset have * the sockets enabled that had events. * * exceptset is not used for now!!! * * @param maxfdp1 the highest socket index in the sets * @param readset_in:    set of sockets to check for read events * @param writeset_in:   set of sockets to check for write events * @param exceptset_in:  set of sockets to check for error events * @param readset_out:   set of sockets that had read events * @param writeset_out:  set of sockets that had write events * @param exceptset_out: set os sockets that had error events * @return number of sockets that had events (read/write/exception) (>= 0) */static intlwip_selscan(int maxfdp1, fd_set *readset_in, fd_set *writeset_in, fd_set *exceptset_in,             fd_set *readset_out, fd_set *writeset_out, fd_set *exceptset_out){  int i, nready = 0;  fd_set lreadset, lwriteset, lexceptset;  struct lwip_sock *sock;  SYS_ARCH_DECL_PROTECT(lev);  FD_ZERO(&lreadset);  FD_ZERO(&lwriteset);  FD_ZERO(&lexceptset);  /* Go through each socket in each list to count number of sockets which     currently match */  for(i = 0; i < maxfdp1; i++) {    void* lastdata = NULL;    s16_t rcvevent = 0;    u16_t sendevent = 0;    u16_t errevent = 0;    /* First get the socket's status (protected)... */    SYS_ARCH_PROTECT(lev);    sock = tryget_socket(i);    if (sock != NULL) {      lastdata = sock->lastdata;      rcvevent = sock->rcvevent;      sendevent = sock->sendevent;      errevent = sock->errevent;    }    SYS_ARCH_UNPROTECT(lev);    /* ... then examine it: */    /* See if netconn of this socket is ready for read */    if (readset_in && FD_ISSET(i, readset_in) && ((lastdata != NULL) || (rcvevent > 0))) {      FD_SET(i, &lreadset);      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for reading\n", i));      nready++;    }    /* See if netconn of this socket is ready for write */    if (writeset_in && FD_ISSET(i, writeset_in) && (sendevent != 0)) {      FD_SET(i, &lwriteset);      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for writing\n", i));      nready++;    }    /* See if netconn of this socket had an error */    if (exceptset_in && FD_ISSET(i, exceptset_in) && (errevent != 0)) {      FD_SET(i, &lexceptset);      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for exception\n", i));      nready++;    }  }  /* copy local sets to the ones provided as arguments */  *readset_out = lreadset;  *writeset_out = lwriteset;  *exceptset_out = lexceptset;  LWIP_ASSERT("nready >= 0", nready >= 0);  return nready;}/** * Processing exceptset is not yet implemented. */intlwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,            struct timeval *timeout){  u32_t waitres = 0;  int nready;  fd_set lreadset, lwriteset, lexceptset;  u32_t msectimeout;  struct lwip_select_cb select_cb;  err_t err;  int i;  SYS_ARCH_DECL_PROTECT(lev);  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select(%d, %p, %p, %p, tvsec=%"S32_F" tvusec=%"S32_F")\n",                  maxfdp1, (void *)readset, (void *) writeset, (void *) exceptset,                  timeout ? (s32_t)timeout->tv_sec : (s32_t)-1,                  timeout ? (s32_t)timeout->tv_usec : (s32_t)-1));  /* Go through each socket in each list to count number of sockets which     currently match */  nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);  /* If we don't have any current events, then suspend if we are supposed to */  if (!nready) {    if (timeout && timeout->tv_sec == 0 && timeout->tv_usec == 0) {      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: no timeout, returning 0\n"));      /* This is OK as the local fdsets are empty and nready is zero,         or we would have returned earlier. */      goto return_copy_fdsets;    }    /* None ready: add our semaphore to list:       We don't actually need any dynamic memory. Our entry on the       list is only valid while we are in this function, so it's ok       to use local variables. */    select_cb.next = NULL;    select_cb.prev = NULL;    select_cb.readset = readset;    select_cb.writeset = writeset;    select_cb.exceptset = exceptset;    select_cb.sem_signalled = 0;    err = sys_sem_new(&select_cb.sem, 0);    if (err != ERR_OK) {      /* failed to create semaphore */      set_errno(ENOMEM);      return -1;    }    /* Protect the select_cb_list */    SYS_ARCH_PROTECT(lev);    /* Put this select_cb on top of list */    select_cb.next = select_cb_list;    if (select_cb_list != NULL) {      select_cb_list->prev = &select_cb;    }    select_cb_list = &select_cb;    /* Increasing this counter tells even_callback that the list has changed. */    select_cb_ctr++;    /* Now we can safely unprotect */    SYS_ARCH_UNPROTECT(lev);    /* Increase select_waiting for each socket we are interested in */    for(i = 0; i < maxfdp1; i++) {      if ((readset && FD_ISSET(i, readset)) ||          (writeset && FD_ISSET(i, writeset)) ||          (exceptset && FD_ISSET(i, exceptset))) {        struct lwip_sock *sock = tryget_socket(i);        LWIP_ASSERT("sock != NULL", sock != NULL);        SYS_ARCH_PROTECT(lev);        sock->select_waiting++;        LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0);        SYS_ARCH_UNPROTECT(lev);      }    }    /* Call lwip_selscan again: there could have been events between       the last scan (whithout us on the list) and putting us on the list! */    nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);    if (!nready) {      /* Still none ready, just wait to be woken */      if (timeout == 0) {        /* Wait forever */        msectimeout = 0;      } else {        msectimeout =  ((timeout->tv_sec * 1000) + ((timeout->tv_usec + 500)/1000));        if (msectimeout == 0) {          /* Wait 1ms at least (0 means wait forever) */          msectimeout = 1;        }      }      waitres = sys_arch_sem_wait(&select_cb.sem, msectimeout);    }    /* Increase select_waiting for each socket we are interested in */    for(i = 0; i < maxfdp1; i++) {      if ((readset && FD_ISSET(i, readset)) ||          (writeset && FD_ISSET(i, writeset)) ||          (exceptset && FD_ISSET(i, exceptset))) {        struct lwip_sock *sock = tryget_socket(i);        LWIP_ASSERT("sock != NULL", sock != NULL);        SYS_ARCH_PROTECT(lev);        sock->select_waiting--;        LWIP_ASSERT("sock->select_waiting >= 0", sock->select_waiting >= 0);        SYS_ARCH_UNPROTECT(lev);      }    }    /* Take us off the list */    SYS_ARCH_PROTECT(lev);    if (select_cb.next != NULL) {      select_cb.next->prev = select_cb.prev;    }    if (select_cb_list == &select_cb) {      LWIP_ASSERT("select_cb.prev == NULL", select_cb.prev == NULL);      select_cb_list = select_cb.next;    } else {      LWIP_ASSERT("select_cb.prev != NULL", select_cb.prev != NULL);      select_cb.prev->next = select_cb.next;    }    /* Increasing this counter tells even_callback that the list has changed. */    select_cb_ctr++;    SYS_ARCH_UNPROTECT(lev);    sys_sem_free(&select_cb.sem);    if (waitres == SYS_ARCH_TIMEOUT)  {      /* Timeout */      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: timeout expired\n"));      /* This is OK as the local fdsets are empty and nready is zero,         or we would have returned earlier. */      goto return_copy_fdsets;    }    /* See what's set */    nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);  }  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: nready=%d\n", nready));return_copy_fdsets:  set_errno(0);  if (readset) {    *readset = lreadset;  }  if (writeset) {    *writeset = lwriteset;  }  if (exceptset) {    *exceptset = lexceptset;  }  return nready;}/** * Callback registered in the netconn layer for each socket-netconn. * Processes recvevent (data available) and wakes up tasks waiting for select. */static voidevent_callback(struct netconn *conn, enum netconn_evt evt, u16_t len){  int s;  struct lwip_sock *sock;  struct lwip_select_cb *scb;  int last_select_cb_ctr;  SYS_ARCH_DECL_PROTECT(lev);  LWIP_UNUSED_ARG(len);  /* Get socket */  if (conn) {    s = conn->socket;    if (s < 0) {      /* Data comes in right away after an accept, even though       * the server task might not have created a new socket yet.       * Just count down (or up) if that's the case and we       * will use the data later. Note that only receive events       * can happen before the new socket is set up. */      SYS_ARCH_PROTECT(lev);      if (conn->socket < 0) {        if (evt == NETCONN_EVT_RCVPLUS) {          conn->socket--;        }        SYS_ARCH_UNPROTECT(lev);        return;      }      s = conn->socket;      SYS_ARCH_UNPROTECT(lev);    }    sock = get_socket(s);    if (!sock) {      return;    }  } else {    return;  }  SYS_ARCH_PROTECT(lev);  /* Set event as required */  switch (evt) {    case NETCONN_EVT_RCVPLUS:      sock->rcvevent++;      break;    case NETCONN_EVT_RCVMINUS:      sock->rcvevent--;      break;    case NETCONN_EVT_SENDPLUS:      sock->sendevent = 1;      break;    case NETCONN_EVT_SENDMINUS:      sock->sendevent = 0;      break;    case NETCONN_EVT_ERROR:      sock->errevent = 1;      break;    default:      LWIP_ASSERT("unknown event", 0);      break;  }  if (sock->select_waiting == 0) {    /* noone is waiting for this socket, no need to check select_cb_list */    SYS_ARCH_UNPROTECT(lev);    return;  }  /* Now decide if anyone is waiting for this socket */  /* NOTE: This code goes through the select_cb_list list multiple times     ONLY IF a select was actually waiting. We go through the list the number     of waiting select calls + 1. This list is expected to be small. */  /* At this point, SYS_ARCH is still protected! */again:  for (scb = select_cb_list; scb != NULL; scb = scb->next) {    if (scb->sem_signalled == 0) {      /* semaphore not signalled yet */      int do_signal = 0;      /* Test this select call for our socket */      if (sock->rcvevent > 0) {        if (scb->readset && FD_ISSET(s, scb->readset)) {          do_signal = 1;        }      }      if (sock->sendevent != 0) {        if (!do_signal && scb->writeset && FD_ISSET(s, scb->writeset)) {          do_signal = 1;        }      }      if (sock->errevent != 0) {        if (!do_signal && scb->exceptset && FD_ISSET(s, scb->exceptset)) {          do_signal = 1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
顶级嫩模精品视频在线看| 日韩欧美国产电影| 精品久久久久一区二区国产| 久久精品一区二区三区不卡| 亚洲成人一区在线| 国产成人激情av| 欧美一级搡bbbb搡bbbb| 亚洲精品高清在线观看| 成人久久18免费网站麻豆| 91精品国产综合久久久蜜臀粉嫩| 国产精品成人免费精品自在线观看| 爽好久久久欧美精品| 99riav久久精品riav| 久久久久久电影| 欧美96一区二区免费视频| 欧美午夜影院一区| 亚洲婷婷综合色高清在线| 国产九色sp调教91| 欧美一区二区三区免费观看视频| 亚洲一区二区三区四区在线免费观看 | 日本韩国精品一区二区在线观看| 26uuu亚洲| 老司机精品视频在线| 3d动漫精品啪啪| 午夜久久久久久| 欧美日韩在线综合| 亚洲国产精品影院| 欧美精品在线视频| 亚洲成人综合网站| 91 com成人网| 青青草国产成人99久久| 宅男噜噜噜66一区二区66| 五月天激情小说综合| 欧美日韩免费电影| 日本亚洲电影天堂| 欧美一级艳片视频免费观看| 日韩高清欧美激情| 日韩写真欧美这视频| 精品午夜一区二区三区在线观看| 日韩欧美一级在线播放| 狠狠色丁香婷婷综合| 久久久99精品久久| 成人高清免费观看| 国产精品久久二区二区| 色婷婷av一区二区三区软件| 亚洲综合免费观看高清完整版 | 9i看片成人免费高清| 国产精品你懂的在线| 成人的网站免费观看| 日韩理论片网站| 欧美日韩国产三级| 九九热在线视频观看这里只有精品| 欧美成人一级视频| av电影天堂一区二区在线观看| 国产精品青草综合久久久久99| 大陆成人av片| 亚洲精品精品亚洲| 在线成人小视频| 国产精品18久久久久久久久 | 9i在线看片成人免费| 亚洲成在人线在线播放| 精品国产一区二区三区四区四 | 欧美一区午夜视频在线观看| 久久99精品久久久久久久久久久久 | 欧美精三区欧美精三区| 麻豆精品久久久| 国产精品第四页| 欧美一级片在线看| 97久久精品人人爽人人爽蜜臀| 怡红院av一区二区三区| 日韩一区二区在线播放| 丰满岳乱妇一区二区三区| 亚洲不卡一区二区三区| 国产亚洲精品超碰| 欧美精品一二三| 成人av影院在线| 久久精品国产一区二区三| 亚洲人精品一区| 久久品道一品道久久精品| 91行情网站电视在线观看高清版| 麻豆成人久久精品二区三区小说| 中文字幕在线不卡| 精品欧美乱码久久久久久| 一本色道久久综合亚洲aⅴ蜜桃| 看电影不卡的网站| 性做久久久久久免费观看欧美| 中文字幕av资源一区| 欧美一级日韩免费不卡| 91麻豆国产福利在线观看| 麻豆国产欧美一区二区三区| 亚洲精选一二三| 日本一区二区三区视频视频| 91精品国产综合久久精品麻豆 | 欧美一区二区久久| 一本色道亚洲精品aⅴ| 国产成人啪免费观看软件| 日韩高清中文字幕一区| 亚洲乱码中文字幕综合| 国产三级精品视频| 精品国产精品一区二区夜夜嗨| 欧美性xxxxxx少妇| 欧美在线制服丝袜| 91国偷自产一区二区开放时间| 国产不卡视频在线播放| 精品一区二区三区在线视频| 日韩电影在线免费| 日韩黄色一级片| 日韩成人午夜精品| 秋霞影院一区二区| 青青草原综合久久大伊人精品优势| 亚洲一区精品在线| 夜夜嗨av一区二区三区四季av| 国产精品亲子伦对白| 日本一区二区三区四区在线视频| 久久婷婷色综合| 久久综合精品国产一区二区三区| 日韩一区二区电影| 欧美一区二区三区在线电影| 9191精品国产综合久久久久久| 欧美日韩国产一区| 日韩一区二区三区四区五区六区| 在线不卡中文字幕| 欧美一级搡bbbb搡bbbb| 久久综合成人精品亚洲另类欧美 | 亚洲一二三级电影| 午夜在线电影亚洲一区| 天堂久久一区二区三区| 视频一区国产视频| 美女视频第一区二区三区免费观看网站| 日日欢夜夜爽一区| 精品一区二区免费| 国产成人亚洲综合色影视| av午夜一区麻豆| 欧美亚洲国产一区二区三区| 精品视频1区2区| 日韩精品一区二区三区老鸭窝| 欧美本精品男人aⅴ天堂| 国产午夜精品在线观看| 亚洲色图在线视频| 日韩高清中文字幕一区| 国产成人在线视频网站| 99视频在线精品| 欧美日韩在线一区二区| 久久无码av三级| 亚洲精品成人精品456| 免费观看在线综合| 成人午夜看片网址| 欧美日韩另类国产亚洲欧美一级| 日韩免费观看高清完整版| 国产精品成人一区二区三区夜夜夜 | 久久成人免费日本黄色| 国产成人夜色高潮福利影视| 色哟哟在线观看一区二区三区| 欧美精三区欧美精三区 | 欧美一区二区三区视频在线 | 日韩一区二区三区免费看| 久久久久九九视频| 亚洲福利电影网| 成人午夜大片免费观看| 欧美在线看片a免费观看| 日韩精品中文字幕在线一区| 国产精品白丝在线| 捆绑变态av一区二区三区| 色综合一区二区三区| 日韩一本二本av| 亚洲欧美视频一区| 国产成人免费视频网站| 欧美人伦禁忌dvd放荡欲情| 亚洲国产精华液网站w| 日韩精品成人一区二区在线| 成人av电影在线播放| 欧美一区二区三区在线电影| 亚洲靠逼com| 顶级嫩模精品视频在线看| 91精品国产福利在线观看| 亚洲女子a中天字幕| 国产福利一区在线| 日韩欧美一区电影| 日韩高清中文字幕一区| 欧美亚洲综合久久| 亚洲欧美欧美一区二区三区| 狠狠色丁香久久婷婷综合丁香| 在线播放欧美女士性生活| 亚洲最新视频在线观看| 91免费看视频| 国产精品福利一区二区三区| 国产呦萝稀缺另类资源| 日韩一区二区三区免费观看| 一区二区三区在线视频播放| thepron国产精品| 欧美激情一区二区三区在线| 国产一区二区三区高清播放| 日韩欧美国产系列| 美女视频黄免费的久久| 91精品国产综合久久蜜臀| 天天色图综合网| 欧美精品 国产精品| 天堂一区二区在线| 日韩亚洲欧美中文三级| 裸体健美xxxx欧美裸体表演|