Les Forums

Les Forums

Les forums sont fermés. Ils restent présent pour consultation et archivage.
Vous pouvez désormais poser vos questions directement dans les commentaires en bas de chaque page du site.
Alors n'hésitez pas à participer

Tcp Syn problème ???

Salut à tous,
voici un petit programme qui envoie un packet tcp syn, le poblème que j'ai rencontré est le suivant : je ne recoit rien le recvfrom retourne -1 ? je ne pige pas le problème ? j'utilise vc++ 2003 sous window xp pack 2
Voici mon code :
[code:1:f722aa8389]
typedef struct ip_hdr
{
unsigned char ip_verlen; // 4-bit IPv4 version and 4-bit header length (in 32-bit words)
unsigned char ip_tos; // IP type of service
unsigned short ip_totallength; // Total length
unsigned short ip_id; // Unique identifier
unsigned short ip_offset; // Fragment offset field
unsigned char ip_ttl; // Time to live
unsigned char ip_protocol; // Protocol(TCP,UDP etc)
unsigned short ip_checksum; // IP checksum
unsigned int ip_srcaddr; // Source address
unsigned int ip_destaddr; // Source address
} IPV4_HDR;
typedef struct tcp_hdr
{
unsigned short tcp_sport;
unsigned short tcp_dport;
unsigned int tcp_seq;
unsigned int tcp_ack;
unsigned short tcp_lenbit;
unsigned short tcp_wnd;
unsigned short tcp_chk;
unsigned short tcp_urg;
} TCP_HDR;

WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2,2);
WSAStartup(wVersionRequested,&wsaData);

SOCKET s=socket(PF_INET,SOCK_RAW,IPPROTO_TCP);
int optval = 1;
int optlen = sizeof(optval);
setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char *)&optval,sizeof(optval));

IPV4_HDR ipv_hdr;
TCP_HDR tcp_hdr;

unsigned short *ptrshort;

ipv_hdr.ip_verlen=0x45;
ipv_hdr.ip_tos=0;
ipv_hdr.ip_totallength=htons(40);
ipv_hdr.ip_id=0;
ipv_hdr.ip_offset=0;
ipv_hdr.ip_ttl=255;
ipv_hdr.ip_protocol=6;
ipv_hdr.ip_checksum=0;
ipv_hdr.ip_srcaddr=inet_addr("184.155.133.247");
ipv_hdr.ip_destaddr=inet_addr("69.31.40.19");

ptrshort=(unsigned short *)&ipv_hdr;

unsigned int sum=0;
for(int i=0;i<20;i+=2)
{
sum+=(*ptrshort);
++ptrshort;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
sum = ~sum;

ipv_hdr.ip_checksum=htons((unsigned short)sum);

tcp_hdr.tcp_sport=htons(36000);
tcp_hdr.tcp_dport=htons(80);
tcp_hdr.tcp_seq=htons(12000);
tcp_hdr.tcp_ack=0;
tcp_hdr.tcp_lenbit=htons(0x0002);
tcp_hdr.tcp_wnd=htons(512);
tcp_hdr.tcp_chk=0;
tcp_hdr.tcp_urg=0;

ptrshort=(unsigned short *)&tcp_hdr;

sum=0;
for(int i=0;i<20;i+=2)
{
sum+=(*ptrshort);
++ptrshort;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
sum = ~sum;

tcp_hdr.tcp_chk=htons((unsigned short)sum);

char buffer[40];
char buf[512];
memcpy(buffer,&ipv_hdr,20);
memcpy(buffer+20,&tcp_hdr,20);

sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(80);
addr.sin_addr.S_un.S_addr=inet_addr("69.31.40.19");

sockaddr addr_r;
int size=sizeof(struct sockaddr);

sendto(s,buffer,40,0,(struct sockaddr *)&addr,sizeof(struct sockaddr));

int r=recvfrom(s,buf,512,0,&addr_r,&size);

int l=sizeof(IPV4_HDR);

closesocket(s);
WSACleanup();
[/code:1:f722aa8389] ❓ ❓ ❓ ❓ ❓ ❓ ❓
mmm, sans même regarder le code, que je ne me permettrais pas de critiquer, je pense qu'il y a peut-être le meme problème qui est souvent mentionné entre le SP2 de WIN XP et les sockets en mode RAW :/
lequel ❓