>sendで送ったバイト数と戻り値が異なっていれば、socketをshutdown & closesocketして、再度、connectする必要があります。
MSDNにはsend関数の解説として
----------------
宣言
int send(SOCKET s,const char FAR *buf,int len,int flags);
戻り値
If no error occurs, send returns the total number of bytes sent, which can be less than the number indicated by len for nonblocking sockets.
----------------
と書かれています。現在使おうと考えているソケットは非ブロッキングです。そのため戻り値では単純にチェックできません。プログラム上でタイムアウトを設定して時間内に指定したバイト数送信できなければcloseと考えるということになりそうですね。
補足
4番の例になるということですね。自分の中では1番可能性がありそうだと思っていたものです。参考URLもまだ詳しくは見ていませんが役に立ちそうです。ありがとうございます。