Показать сообщение отдельно

  #5  
Старый 24.06.2008, 18:17
nc.STRIEM
Members of Antichat - Level 5
Регистрация: 05.04.2006
Сообщений: 1,066
Провел на форуме:
3493315

Репутация: 1228


Отправить сообщение для nc.STRIEM с помощью ICQ
По умолчанию

вот, когдато писал

socks4
Код:
SOCKET socks4(char *socks, int sockport, char *server, int srvport)
{
	struct hostent *Ip = gethostbyname(socks);
	if(Ip == NULL) 
		return 0;

	sockaddr_in sa;
	sa.sin_family = AF_INET;
	sa.sin_port = htons(sockport);
	sa.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)Ip->h_addr)));

	char pack[12];
	pack[0] = 0x04;
	pack[1] = 0x01;
	pack[2] = srvport/256;
	pack[3] = srvport%256;
	
	Ip = gethostbyname(server);
	if(Ip == NULL) 
		return 0;
	char ip[16];
	strcpy(ip, inet_ntoa(*((struct in_addr *)Ip->h_addr)));
	char *p = ip;
	int i, j = strlen(ip), k=4;
	for(i = 0; i<j; i++)
		if(ip[i] == '.')
		{
			ip[i] = 0;
			pack[k] = atoi(p);
			k++;
			p = ip+i+1;
		}
	pack[k] = atoi(p);

	pack[8] = rand()%255;
	pack[9] = rand()%255;
	pack[10] = rand()%255;
	pack[11] = 0x00;

	SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(s == SOCKET_ERROR)
		return SOCKET_ERROR;

	if(connect(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
		return SOCKET_ERROR;

	if(send(s, pack, 12, 0) == SOCKET_ERROR)
		return SOCKET_ERROR;
	
	i = recv(s, pack, 4, 0);
	if(i == 0 || i == SOCKET_ERROR)
		return SOCKET_ERROR;
	if(pack[1] == 0x5a)
		return s;
	return 0;
}

socks5
Код:
SOCKET socks5(char *socks, int sockport, char *server, int srvport)
{
	struct hostent *Ip = gethostbyname(socks);
	if(Ip == NULL) 
		return 0;
	
	sockaddr_in sa;
	sa.sin_family = AF_INET;
	sa.sin_port = htons(sockport);
	sa.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)Ip->h_addr)));
	
	char pack[12];
	SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(s == SOCKET_ERROR)
		return SOCKET_ERROR;
	
	if(connect(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
		return SOCKET_ERROR;
	
	if(send(s, pack, 3, 0) == SOCKET_ERROR)
		return SOCKET_ERROR;
	
	int i = recv(s, pack, 2, 0);
	if(i == 0 || i == SOCKET_ERROR)
		return SOCKET_ERROR;
	if(pack[0] != 0x05 || pack[1] == 0xFF)
			return 0;

	pack[0] = 0x05;
	pack[1] = 0x01;
	pack[2] = 0x00;
	pack[3] = 0x01;
	
	Ip = gethostbyname(server);
	if(Ip == NULL) 
		return 0;
	char ip[16];
	strcpy(ip, inet_ntoa(*((struct in_addr *)Ip->h_addr)));
	int  j = strlen(ip), k=4;
	char *p = ip;
	for(i = 0; i<j; i++)
		if(ip[i] == '.')
		{
			ip[i] = 0;
			pack[k] = atoi(p);
			k++;
			p = ip+i+1;
		}
	pack[k] = atoi(p);
	pack[8] = srvport/256;
	pack[9] = srvport%256;

	if(send(s, pack, 10, 0) == SOCKET_ERROR)
		return SOCKET_ERROR;
	
	i = recv(s, pack, 10, 0);
	if(i == 0 || i == SOCKET_ERROR)
		return SOCKET_ERROR;
	if(pack[0] == 0x05 && pack[1] == 0x00)
			return s;
	return 0;
}
 
Ответить с цитированием