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

[Вопрос по Си] MRIM авторизация
  #1  
Старый 01.04.2010, 20:56
f0rward
Новичок
Регистрация: 26.10.2008
Сообщений: 15
С нами: 9231707

Репутация: 6
По умолчанию [Вопрос по Си] MRIM авторизация

Код:
int mrim_test() {
	SOCKET hSock;
	struct sockaddr_in hAddr;
	char buf[1024], req[256];
	int res;
	struct _MRIM_ADDR mrim_addr;
	struct mrim_packet_header_t cs, sc;

	if((hSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {
		printf("[-] create socket\n");
		return -1;
	}
	printf("[+] create socket\n");
	hAddr.sin_family = AF_INET;
	hAddr.sin_port = htons(MRIM_PORT);
	hAddr.sin_addr.s_addr = inet_addr(MRIM_HOST); // ip mrim.mail.ru
	if(connect(hSock, (struct sockaddr*)&hAddr, sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
		printf("[-] connect 2 mrim.mail.ru:443\n");
		closesocket(hSock);
		return -1;
	}
	printf("[+] connect 2 mrim.mail.ru:443\n");
	sprintf(req, "CONNECT mrim.mail.ru:443 HTTP/1.0\r\n\r\n");
	if(send(hSock, req, strlen(req), 0)==SOCKET_ERROR) {
		printf("[-] send packet 2 mrim.mail.ru:443\n");
		closesocket(hSock);
		return -1;
	}
	printf("[+] send packet 2 mrim.mail.ru:443\n");
	if(recv(hSock, buf, sizeof(buf)-1, 0)==SOCKET_ERROR) {
		printf("[-] recv answer from mrim.mail.ru:443\n");
		closesocket(hSock);
		return -1;
	}
	printf("[+] recv answer from mrim.mail.ru:443\n");
	strtok(buf, "\r\n");
	strtok(buf, ":");
	strcpy(mrim_addr.host, buf); 
	mrim_addr.port = atoi(strtok(NULL, ":"));
	printf("[+] get connection server: %s:%d\n", mrim_addr.host, mrim_addr.port);
	printf("\nrecreating socket...\n\n");
	closesocket(hSock);
	hSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if((hSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {
		printf("[-] create socket\n");
		return -1;
	}
	printf("[+] create socket\n");
	hAddr.sin_family = AF_INET;
	hAddr.sin_port = htons(mrim_addr.port);
	hAddr.sin_addr.s_addr = inet_addr(mrim_addr.host);
	if(connect(hSock, (struct sockaddr*)&hAddr, sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
		printf("[-] connect 2 %s:%d\n", mrim_addr.host, mrim_addr.port);
		closesocket(hSock);
		return -1;
	}
	printf("[+] connect 2 %s:%d\n", mrim_addr.host, mrim_addr.port);
	cs.magic = CS_MAGIC;
	cs.proto = PROTO_VERSION;
	cs.msg = MRIM_CS_HELLO;
	if(send(hSock, (unsigned char*)&cs, PACKET_SIZE, 0) == SOCKET_ERROR) {
		printf("[-] send MRIM_CS_HELLO\n");
		closesocket(hSock);
		return -1;
	}
	printf("[+] send MRIM_CS_HELLO\n");
	if (recv(hSock, (char *)&sc, PACKET_SIZE, 0) == SOCKET_ERROR) {	printf("[-] recv MRIM_CS_HELLO\n");
		closesocket(hSock);
		return -1;
	}
	printf((sc.msg == MRIM_CS_HELLO_ACK ? "[+] recv MRIM_CS_HELLO_ACK\n": "[+] recv %d\n"), sc.msg);

	closesocket(hSock);
	return 0;
}
Собственно в выделенном месте серв должен возвращать MRIM_CS_HELLO_ACK на сколько я понимаю, но у меня этого не происходит, скорее всего что-то напутал.
Прошу помощи, нужно дойти до авторизации.
 
Ответить с цитированием