
02.07.2008, 19:13
|
|
Постоянный
Регистрация: 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)
Она не зависает....но и не работает. Помогите плиз...
|
|
|