状況
まず、同期受信関数は子スレッドで動作しているものとする。
親スレッドは受信スレッドを立ち上げた後、メッセージループなんかでプログラムの終了コードを待っている状態。
この場合、親スレッドでソケットをクローズしてもブロッキングは解除されない。cancel()関数は非同期の話。
なので、結局は子スレッドのjoinを待たずに無理やり殺すしか方法は無いみたいです。
それ以前に
素直に非同期IO使えって話ですね。はい。
一応
受信前にavailable()関数でデータ来ているかチェックしておけば、一応ブロッキングを回避出来るみたいです。