The recent research works in wireless networks prompt the opportunistic transmission that exploits 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 a time-varying channel among different receivers to improve system performance. Maximizing the overall throughput and satisfying the QoS requirements for the transmission flows are two important objectives that need to be considered. In literature, many opportunistic scheduling policies for ad hoc networks have been proposed, in which each transmitter independently schedules the transmission. However, due to cochannel interference, the decisions of neighboring transmitters are highly correlated. Moreover, to achieve the QoS requirements, the nodes have to be cooperative to share the common wireless channel. In this paper, we formulate the opportunistic scheduling problem, taking the interaction among the neighboring transmitters into account. We present an optimal scheduling policy which maximizes the overall network performance while satisfying the QoS requirements of the individual flows. We also propose a distributed cooperative and opportunistic scheduling algorithm that modifies the IEEE 802.11 protocol to implement the optimal scheduling policy. Simulation results indicate that our implementation achieves higher network throughput and provides better QoS support than the existing solutions.