Tillekeratne Dilshan (58) and Russel Arnold (50) were mainly responsible for Sri Lanka's total, putting on 97 for the sixth wicket after their side slumped to 98 for five.
But after Dilshan was caught at third man off Makhaya Ntini, who took two for 26, Sri Lanka lost their last four wickets for one run, with Langeveldt taking three wickets in his final over all to attempted big hits.
South Africa bowled accurately after Sri Lanka won the toss and batted on a new, untried surface which proved to be slow but true.
Sri Lanka made a rapid start with left-handed opening batsman Upul Tharanga and Sanath Jayasuriya seemingly targeting South African opening bowler Shaun Pollock.
Tharanga was caught at slip off Ntini for 12 but Jayasuriya continued to bat aggressively against Pollock, forcing South African captain Graeme Smith to take him off after the world number one ranked one-day bowler conceded 32 runs in four overs.
Langeveldt, who replaced Pollock, claimed the wickets of Jayasuriya, who top-edged an attempted square cut to point, and captain Mahela Jayawardene, who was caught at cover off a leading edge when he tried to play to leg.
Sri Lanka were in trouble when Kumar Sangakkara gloved a catch to wicketkeeper Mark Boucher off Andrew Hall and Chamara Silva was run out by Herschelle Gibbs who ran in and dived into the stumps from backward point after Silva started on a run and was sent back.
South Africa, needing a win to get their campaign back on track after losing against Australia in St Kitts Saturday, brought in left-arm spin bowler Robin Peterson in place of batsman Ashwell Prince.
Seam bowler Farveez Maharoof returned for Sri Lanka in place of Dilhara Fernando.
Sri Lanka already have two Super Eight points following a win over fellow group qualifiers Bangladesh.
Sri Lanka 209 all out in 49.3 overs (Dilshan 58, Arnold 50, Sangakkara 28, Jayasuriya 22; Langeveldt 5 for 39, Ntini 2 for 26, Hall 1 for 33) Vs South Africa (yet to bat)