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

  #10  
Старый 02.07.2008, 19:13
criz
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме:
811764

Репутация: 119
По умолчанию

Помогите, пжлста, найти источник проблемы. Формирую тсп-пакет, с syn-флагом, отправляю.
Код:
void send_packet(SOCKET sd, unsigned short port, struct sockaddr_in source,  char *ip)
{

	struct sockaddr_in servaddr;

	memset(&servaddr, 0, sizeof(servaddr));

	servaddr.sin_family	=	AF_INET;
	servaddr.sin_port	=	htons(port);
	servaddr.sin_addr.s_addr	=	inet_addr(DEST);

	tcp_hdr.sport	=	getpid();
	tcp_hdr.dport	=	htons(port);
	tcp_hdr.seqnum	=	getpid() + port;
	tcp_hdr.acknum	=	0;
	tcp_hdr.flags	=	0x02;
	tcp_hdr.win		=	htons(128);
	tcp_hdr.crc		=	0;
	tcp_hdr.urgptr	=	0;

	pseudo_hdr.source_addr	=	source.sin_addr.s_addr;
	pseudo_hdr.dest_addr	=	servaddr.sin_addr.s_addr;
	pseudo_hdr.place_hold	=	0;
	pseudo_hdr.proto		=	IPPROTO_TCP;
	pseudo_hdr.length		=	htons(sizeof(struct tcp_header));

	memcpy(&tcp_hdr, &pseudo_hdr, sizeof(struct tcp_header));
	
	tcp_hdr.crc		=	chksum((unsigned short *)&pseudo_hdr, sizeof(struct pseudo_hdr));

	if(sendto(sd, &tcp_hdr, sizeof(struct tcp_header), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
	{
		printf("Error: sendto() failed\n %d", WSAGetLastError());
		exit(-1);		
	}

}
Тут все норм, ГетЛастЕррор молчит
Затем жду ответа от сервера:
Код:
int recv_packet(SOCKET sd)
{
	char recvbuf[1500];
	struct tcp_header *tcphdr = (struct tcp_header *)(recvbuf + sizeof(struct ip_hdr));

	while(1)
	{
		if(recv(sd, recvbuf, sizeof(recvbuf), 0) < 0)
		{
			printf("Error: recv() failed\n %d", WSAGetLastError());
		}

		if(tcphdr->dport == getpid())
		{
			if((tcphdr->flags == 0x02) && (tcphdr->flags == 0x10))
				return 1;
			else
				return 0;
		}
	}
}
Прога останавливается на:
Код:
		if(recv(sd, recvbuf, sizeof(recvbuf), 0) < 0)
Она не зависает....но и не работает. Помогите плиз...
 
Ответить с цитированием