Esempio n. 1
0
/*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;
}