Zapuskaetsya server. Klient soedinyaetsya, poyavlyaetsya[/trn] CMD [trn]okno, klient nazhimaet bukvu e i zakrivaet soedinenie. soedinenie ne zakryto-telnet prodolzhaet viset'. [/trn]
CMD [trn]zapuskaetsya s opciej [/trn] handle inheritance [trn]. eto ya pomenyat' ne mogu. ONO NADO. Eto i delaet problemy. Priroda problemy bolee menee ponaytna. Vopros - chto delat' ? Nado chtob [/trn] closesocket [trn] zakrival soedinenie, a [/trn] cmd [trn] prodolzhal bezhat'[/trn]
Код: Выделить всё
#include <winsock2.h> // link with Ws2_32.lib
#include <process.h>
#include <stdio.h>
SOCKET g_socket;
struct sockaddr_in g_SrvAddr;
//----------------------------------------------------------------
//
//----------------------------------------------------------------
void DealWithClient(void* pSock)
{
SOCKET* pSocket = (SOCKET*)pSock;
char szBuf[1024];
int nRecv(0);
if(pSocket <= 0)
{
return;
}
PROCESS_INFORMATION pi;
STARTUPINFO si;
::ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
BOOL bResult = ::CreateProcess( NULL, "cmd.exe", NULL, NULL,
TRUE, // handle inheritance option !
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
if(bResult == FALSE)
{
printf("[%d] cmd.exe not created\n", *pSocket);
}
else
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
while(1)
{
memset(szBuf, 0, 1024);
// loop is missing
nRecv = recv(*pSocket, szBuf, 1023, 0);
if(nRecv <= 0)
{
printf("[%d] recv return %d, last error=%d\n", *pSocket, nRecv, GetLastError());
return;
}
szBuf[nRecv] = 0;
printf("[%d] -> [%s]\n", *pSocket, szBuf);
if(szBuf[0] == 'e')
{
if(closesocket(*pSocket) == SOCKET_ERROR)
{
printf("[%d] close socket failed. last error %d\n", *pSocket, GetLastError());
return;
}
else
{
printf("[%d] Socket closed\n", *pSocket);
return;
}
}
sprintf(szBuf, "'e' to exit\r\n");
// loop is missing
if(send(*pSocket, szBuf, strlen(szBuf), 0) == SOCKET_ERROR)
{
printf("[%d] send failed, last error=%d\n", *pSocket, GetLastError());
return;
}
} // end while
printf("[%d] <- DealWithClient", *pSocket);
}
//----------------------------------------------------------------
// nobody cleanup !
//----------------------------------------------------------------
bool InitWinSock(void)
{
WSADATA wsData;
if(WSAStartup(MAKEWORD(2, 2), &wsData) != 0)
{
return false;
}
return true;
}
//----------------------------------------------------------------
//
//----------------------------------------------------------------
bool PrepareListenerSocket(void)
{
g_socket = socket(AF_INET, SOCK_STREAM, 0);
if(g_socket == INVALID_SOCKET)
{
return false;
}
memset(&g_SrvAddr, 0, sizeof(g_SrvAddr));
g_SrvAddr.sin_family = AF_INET;
g_SrvAddr.sin_addr.s_addr= htonl(INADDR_ANY);
g_SrvAddr.sin_port = htons(9000);
if(bind(g_socket, (struct sockaddr*)&g_SrvAddr, sizeof(g_SrvAddr)) == INVALID_SOCKET)
{
return false;
}
if(listen(g_socket, 5) == INVALID_SOCKET)
{
return false;
}
return true;
}
//----------------------------------------------------------------
//
//----------------------------------------------------------------
void main(void)
{
if(InitWinSock() == false)
{
puts("InitWinSock() failed");
return;
}
if(PrepareListenerSocket() == false)
{
puts("PrepareListenerSocket() failed");
return;
}
struct sockaddr_in ClientAddr;
int nLen = sizeof(ClientAddr);
SOCKET ConSock(INVALID_SOCKET);
while(1)
{
memset(&ClientAddr, 0, nLen);
ConSock = accept(g_socket, (struct sockaddr*)&ClientAddr, &nLen);
printf("connected socket %d\n", ConSock);
// leak
if(_beginthread(DealWithClient, 0, new SOCKET(ConSock)) == -1)
{
printf("failed to create thread !");
}
} // end while
}