TCP/IP. handle inheritance problem

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
dima
Житель
Сообщения: 690
Зарегистрирован: 19 фев 2003, 19:26
Откуда: Хабаровск->Toronto

TCP/IP. handle inheritance problem

Сообщение dima »

[trn]Problema - vyzov [/trn] closesocket(s) [trn]ne vsegda zakrivaet soedinenie. Prilogau uproshennyj(ochen') primer servera. Klient - telnet.

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
}

Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Re: TCP/IP. handle inheritance problem

Сообщение ajkj3em »

shutdown(s, SD_BOTH);
closesocket(s);
Аватара пользователя
dima
Житель
Сообщения: 690
Зарегистрирован: 19 фев 2003, 19:26
Откуда: Хабаровск->Toronto

thx

Сообщение dima »

[trn]Spasibo. pomoglo. Okazyvaetsya [/trn] shutdown(s, SD_SEND) [trn] posylaet [/trn] FIN [trn][/trn]
Ответить