The recent researches in wireless networks prompt the opportunistic transmission that exploiting channel fluctuations to improve the overall system performance. In wireless ad hoc networks, nodes may have packets destined to multiple neighboring nodes. We consider an opportunistic scheduling that takes advantage of time-varying channel among different receivers. Maximizing over system throughput and satisfying QoS requirements for transmission flows are two important objectives that need to be considered. In this paper, we formulate the opportunistic scheduling problem as an optimization problem which maximizes the overall network performance while satisfying QoS constraints of individual flows. We also proposed COS, a distributed cooperative and opportunistic scheduling algorithm, which modifies IEEE 802.11 protocol to implement the optimal scheduling policy by introducing the cooperation among neighboring transmitters. Simulation results indicate that our implementation achieves higher network throughput and provides better QoS support than existing work.