nsapi_size_or_error_t NanostackInterface::socket_sendto(void *handle, const SocketAddress &address, const void *data, nsapi_size_t size) { if (address.get_ip_version() != NSAPI_IPv6) { return NSAPI_ERROR_UNSUPPORTED; } ns_address_t ns_address; convert_mbed_addr_to_ns(&ns_address, &address); /*No lock gaurd needed here as do_sendto() will handle locks.*/ return do_sendto(handle, &ns_address, data, size); }
//分析message函数, on_read之后调用 void talk_to_client::do_analyze(const std::string &msg) { if (msg.find(requests.request_register) == 0)do_register(msg); else if (msg.find(requests.request_login) == 0)do_login(msg); else if (msg.find(requests.request_ping) == 0)do_ping(); else if (msg.find(requests.request_ask) == 0)do_anw_clients(); else if (msg.find(requests.request_send_to) == 0)do_sendto(msg); else if (msg.find(requests.request_exit) == 0)do_exit(); else std::cout << msg << std::endl; return; }
nsapi_size_or_error_t NanostackInterface::socket_send(void *handle, const void *data, nsapi_size_t size) { return do_sendto(handle, NULL, data, size); }
PUBLIC int uds_ioctl(message *dev_m_in, message *dev_m_out) { int minor; #if DEBUG == 1 static int call_count = 0; printf("(uds) [%d] uds_ioctl() call_count=%d\n", uds_minor(dev_m_in), ++call_count); printf("Endpoint: 0x%x | Position 0x%x\n", dev_m_in->IO_ENDPT, dev_m_in->POSITION); #endif minor = uds_minor(dev_m_in); if (uds_fd_table[minor].state != UDS_INUSE) { /* attempted to close a socket that hasn't been opened -- * something is very wrong :( */ uds_set_reply(dev_m_out, TASK_REPLY, dev_m_in->IO_ENDPT, (cp_grant_id_t) dev_m_in->IO_GRANT, EINVAL); return EINVAL; } /* track the system call we are performing in case it gets cancelled */ uds_fd_table[minor].call_nr = dev_m_in->m_type; uds_fd_table[minor].ioctl = dev_m_in->COUNT; uds_fd_table[minor].syscall_done = 0; /* setup select(2) framework */ uds_fd_table[minor].selecting = 0; /* update the owner endpoint - yes it's really stored in POSITION */ uds_fd_table[minor].owner = dev_m_in->POSITION; switch (dev_m_in->COUNT) { /* Handle the ioctl(2) command */ case NWIOSUDSCONN: /* connect to a listening socket -- connect() */ return do_connect(dev_m_in, dev_m_out); case NWIOSUDSACCEPT: /* accept an incoming connection -- accept() */ return do_accept(dev_m_in, dev_m_out); case NWIOSUDSBLOG: /* set the backlog_size and put the socket into the * listening state -- listen() */ return do_listen(dev_m_in, dev_m_out); case NWIOSUDSTYPE: /* set the type for this socket (i.e. * SOCK_STREAM, SOCK_DGRAM, etc) -- socket() */ return do_socket(dev_m_in, dev_m_out); case NWIOSUDSADDR: /* set the address for this socket -- bind() */ return do_bind(dev_m_in, dev_m_out); case NWIOGUDSADDR: /* get the address for this socket -- getsockname() */ return do_getsockname(dev_m_in, dev_m_out); case NWIOGUDSPADDR: /* get the address for the peer -- getpeername() */ return do_getpeername(dev_m_in, dev_m_out); case NWIOSUDSSHUT: /* shutdown a socket for reading, writing, or * both -- shutdown() */ return do_shutdown(dev_m_in, dev_m_out); case NWIOSUDSPAIR: /* connect two sockets -- socketpair() */ return do_socketpair(dev_m_in, dev_m_out); case NWIOGUDSSOTYPE: /* get socket type -- getsockopt(SO_TYPE) */ return do_getsockopt_sotype(dev_m_in, dev_m_out); case NWIOGUDSPEERCRED: /* get peer endpoint -- getsockopt(SO_PEERCRED) */ return do_getsockopt_peercred(dev_m_in, dev_m_out); case NWIOSUDSTADDR: /* set target address -- sendto() */ return do_sendto(dev_m_in, dev_m_out); case NWIOGUDSFADDR: /* get from address -- recvfrom() */ return do_recvfrom(dev_m_in, dev_m_out); case NWIOGUDSSNDBUF: /* get the send buffer size -- getsockopt(SO_SNDBUF) */ return do_getsockopt_sndbuf(dev_m_in, dev_m_out); case NWIOSUDSSNDBUF: /* set the send buffer size -- setsockopt(SO_SNDBUF) */ return do_setsockopt_sndbuf(dev_m_in, dev_m_out); case NWIOGUDSRCVBUF: /* get the send buffer size -- getsockopt(SO_SNDBUF) */ return do_getsockopt_rcvbuf(dev_m_in, dev_m_out); case NWIOSUDSRCVBUF: /* set the send buffer size -- setsockopt(SO_SNDBUF) */ return do_setsockopt_rcvbuf(dev_m_in, dev_m_out); case NWIOSUDSCTRL: /* set the control data -- sendmsg() */ return do_sendmsg(dev_m_in, dev_m_out); case NWIOGUDSCTRL: /* set the control data -- recvmsg() */ return do_recvmsg(dev_m_in, dev_m_out); default: /* the IOCTL command is not valid for /dev/uds -- * this happens a lot and is normal. a lot of * libc functions determine the socket type with * IOCTLs. Any not for us simply get a EBADIOCTL * response. */ uds_fd_table[minor].syscall_done = 1; uds_set_reply(dev_m_out, TASK_REPLY, dev_m_in->IO_ENDPT, (cp_grant_id_t) dev_m_in->IO_GRANT, EBADIOCTL); return EBADIOCTL; } }