며칠 전에 sendto()에서 반환 된 오류에 대한 게시물을 작성했습니다. 그것은 나를 0 바이트 쓰기 난 힘든 난 null이 아닌 값을 길이로 전달 반환했습니다.Sendto()가 여전히 0 바이트를 보냈습니다
void caught_packet(u_char *user_args,const struct pcap_pkthdr *cap_header,const u_char *packet){
int bcount,sockfd; //Bytes written and Socket Descriptor
char new_packet[sizeof(struct ip_hdr) + sizeof(struct tcp_hdr)]; //New Packet
struct ip_hdr *iphdr; //IP Header
struct tcp_hdr *tcphdr; //TCP Header
struct ip_hdr *iphdr_new; //New IP Header
struct tcp_hdr *tcphdr_new; //New TCP Header
struct sockaddr_in sin; //sockaddr_in
u_long src_ip,dest_ip; //source ip,dest ip
int src_port,dest_port; //source port,dest port
//Initialize New_Packer
memset(new_packet,0,(sizeof(struct ip_hdr) + sizeof(struct tcp_hdr)));
//Assign to sockfd argument passed by callback function
sockfd = *((int *)user_args);
//Assign old header to iphdr and tcphdr
iphdr = (struct ip_hdr *)(packet + sizeof(struct ether_header));
tcphdr = (struct tcp_hdr *)(packet + sizeof(struct ether_header) + sizeof(struct ip_hdr));
//Assign new header to buffer new_packet converting its address in structs
iphdr_new = (struct ip_hdr *) new_packet;
tcphdr_new = (struct tcp_hdr *) (new_packet + sizeof(struct ip_hdr));
src_ip = ntohl(iphdr -> ip_src_addr);
dest_ip = ntohl(iphdr -> ip_dest_addr);
src_port = ntohs(tcphdr -> tcp_src_port);
dest_port = ntohs(tcphdr -> tcp_dest_port);
sin.sin_family = AF_INET;
//pretends to be source port
sin.sin_port = htons(src_port);
//pretends to be source address
sin.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)&src_ip)));
//Filling up new_iphdr
//TOS
iphdr_new->ip_tos = IPTOS_LOWDELAY;
//TOT_LEN
iphdr_new->ip_len = sizeof(struct ip_hdr)+sizeof(struct tcp_hdr);
//ID
iphdr_new->ip_id = htons((u_int16_t)random_number(3));
//FRAG_OFF
iphdr_new->ip_frag_offset = htons((u_int16_t)random_number(3));
//TTL
iphdr_new->ip_ttl = IPDEFTTL;
//PROTOCOL
iphdr_new->ip_type = IPPROTO_TCP;
//Source address (Dest) <-->
iphdr_new->ip_src_addr = htonl(dest_ip);
//Destination address (Source) <-->
iphdr_new->ip_dest_addr = htonl(src_ip);
//Filling up new_tcphdr
//Source port (Dest) <-->
tcphdr_new->tcp_src_port = htons(dest_port);
//Destination port (Source) <-->
tcphdr_new->tcp_dest_port = htons(src_port);
//SEQ (ACK) <-->
tcphdr_new->tcp_seq = tcphdr->tcp_ack;
//ACK (SEQ) <-->
tcphdr_new->tcp_ack = (tcphdr->tcp_seq + 1) ;
//Flags
tcphdr_new->tcp_flags = TCP_SYN|TCP_ACK;
//Window Size
tcphdr_new->tcp_window = htons((u_int16_t)random_number(3));
//Checksum (Done by Kernel)
tcphdr_new->tcp_checksum = 0;
//Urgent Pointer
tcphdr_new->tcp_urgent = 0;
//CheckSum Ip header
iphdr_new->ip_checksum = csum((unsigned short *)new_packet,sizeof(struct ip_hdr) + sizeof(struct tcp_hdr));
//Deliver packet to destination
if(bcount = sendto (sockfd,new_packet,iphdr_new->ip_len,0,(struct sockaddr *)&sin,sizeof(sin))<0)
printf("Couldn't send RESET Packet\n");
else{
printf("Bing! ");
printf("(%d) bytes sent \n",bcount);
}
}
이것은 내 코드입니다. ip_hdr 및 tcp_hdr 구조체는 간단한 ip 및 tcp 헤더를 만드는 구조체입니다. 정말 이상합니다. 다른 소프트웨어에서 항상 작동했습니다. 도와주세요. 할당 연산자 (=
)가 작아보다 연산자 (<
)`
if (bcount = sendto(..) < 0)
가 동일한 발현보다 낮은 우선 순위를 갖기 때문에
if((bcount = sendto (sockfd,new_packet,iphdr_new->ip_len,0,(struct sockaddr *)&sin,sizeof(sin))<0))
:
정확히 무엇이 인쇄됩니까? "(0) bytes sent"? – CrazyCasta
왜'connect (2)'로 연결을 설정하고'send (2)'로 보내는 대신 자신의 TCP 패킷을 만드는 중입니까? –
헤더를 편집하려면 – REmaxer