/*udp write process*/ int udp_write(struct peer *peer){ struct stream *s; int num; int count =0; int writenum; //get first stream; s = misaka_write_packet (peer->obuf); if (!s) return 0; /* udp Nonblocking write */ do { /* Number of bytes to be sent. */ writenum = stream_get_endp (s) - stream_get_getp (s); /* Call write() system call.*/ num = sendto(peer->fd, STREAM_PNT (s), writenum, \ 0, (struct sockaddr*)&s->dsu.sin, sizeof(struct sockaddr)); if (num < 0) { } if (num != writenum) { } /*OK we send packet so delete packet. */ misaka_packet_delete (peer->obuf); }while (++count < MISAKA_WRITE_PACKET_MAX && (s = misaka_write_packet (peer->obuf)) != NULL); return count; }
int ppp_tcp_write (struct thread *thread) { struct ppp_mcp_sock *peer; struct stream *stream; int num; int write_errno; int val, writenum; /* Yes first of all get peer pointer. */ peer = THREAD_ARG (thread); peer->t_write = NULL; if (peer->fd < 0) { PPPD_DEBUG_TCP("write: peer's fd is negative value %d", peer->fd); return -1; } if(peer->connect_status != CLIENT_CONNECT_SERVER_OK) return -1; while (1) { stream = stream_fifo_head(peer->obuf); if (stream == NULL) return 0; val = fcntl (peer->fd, F_GETFL, 0); fcntl (peer->fd, F_SETFL, val | O_NONBLOCK); /* Number of bytes to be sent. */ writenum = stream_get_endp (stream) - stream_get_getp (stream); /* Call write() system call. */ num = write (peer->fd, STREAM_PNT (stream), writenum); write_errno = errno; fcntl (peer->fd, F_SETFL, val); if (num < 0) { if (write_errno == EWOULDBLOCK || write_errno == EAGAIN || write_errno == EINTR) break; PPPD_DEBUG_TCP("erro,write packet to peer:%s, fd:%u", peer->hostname, peer->fd); ppp_connect_mcp_error_deal(peer); return 0; } /*发送了数据之后,推迟保活定时器*/ if(num > 0) pppd_postpone_keepalive_timer(peer); if (num != writenum) { stream_forward_getp(stream, num); break; } else stream_free(stream_fifo_pop (peer->obuf)); break; } if(stream_fifo_head (peer->obuf)) MCP_WRITE_ON (peer->t_write, ppp_tcp_write, peer, peer->fd); return 0; }