Nei tuoi programmi ci sono vari errori logici. WSAStartup inizializza le strutture di winsock e va eseguito una sola volta all'inizio del programma prima di eseguire qualsiasi operazione che coinivolga le socket. Idem per WSACleanup. Indi per cui non li puoi mettere nel ciclo ma rispettivamente prima e dopo il ciclo.

Idem per il riempimento della struttura sock_addr. Va prima dell'inizio del ciclo.
Idem per connect e per closesocket, va dopo la fine del ciclo. Stai usando una socket STREAM... la connessione persiste finche non la chiudi.

A blocchi:
codice:
WSAStartup
socket()
riempimento sock_addr
connect
if (x==0){ recv...}

for(;;)
{

 dialogo

}

closesocket
WSACleanup
Idem per il server:

codice:
WSAStartup
socket()
riempimento sock_addr
bind
listen
accept

send

for(;;)
{

 recv

}

closesocket
WSACleanup

studiadi bene cosa fanno i vari comandi sulle socket...