Uygulamamın TCP SYN paketi oluşturmasını ve ağa göndermesini istiyorum. Çekirdeğin IP Header'ı doldurmasını istediğim için setsockopt
kullanarak IP_HDRINCL
ayarlamamıştım. C - ham soketi kullanarak IP üstbilgisini doldurmadan TCP SYN oluştur
- çalıştı.
İkisi Yukarıdaki yöntemler sendto
hata döndürdü -1 ve errno i sendto
hatası -1 ve errno 88 alıyorum Neden
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <errno.h>
int main()
{
int sockfd;
if(sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP) < 0)
{
printf("sokcet functin failed : \n");
exit (-1);
}
char packet[512];
struct sockaddr_in remote; // remote address
struct iphdr *ip = (struct iphdr *) packet;
struct tcphdr *tcp = (struct tcphdr *) packet + sizeof(struct iphdr);
/*
struct tcphdr *tcp = (struct tcphdr *) packet; // tcp header
*/
remote.sin_family = AF_INET; // family
remote.sin_addr.s_addr = inet_addr("192.168.0.57"); // destination ip
remote.sin_port = htons(atoi("3868")); // destination port
memset(packet, 0, 512); // set packet to 0
tcp->source = htons(atoi("6668")); // source port
tcp->dest = htons(atoi("3868")); // destination port
tcp->seq = htons(random()); // inital sequence number
tcp->ack_seq = htons(0); // acknowledgement number
tcp->ack = 0; // acknowledgement flag
tcp->syn = 1; // synchronize flag
tcp->rst = 0; // reset flag
tcp->psh = 0; // push flag
tcp->fin = 0; // finish flag
tcp->urg = 0; // urgent flag
tcp->check = 0; // tcp checksum
tcp->doff = 5; // data offset
int err;
if((err = sendto(sockfd, packet, sizeof(struct iphdr), 0, (struct sockaddr *)&remote, sizeof(struct sockaddr))) < 0)
{ // send packet
printf("Error: Can't send packet : %d %d !\n\n", err, errno);
return -1;
}
kullanılan kod aşağıdadır 88 olarak ayarlanır? Ayrıca, sendto
işlevinde ikinci bağımsız değişkende kullanılacak olan veri uzunluğunun nasıl belirleneceğini bilmek istiyorum. Eğer paket bayt tamponu yani 512 bayt boyutuna kodlarsam yanlış mıdır?
"herkes bana yardımcı olabilir ..
Ben yardımcı olabilir düşünüyorum ... Ama bu size hatayı düzeltmek böylece bu hatanın anlamını verecek ... cevap değil Sendto hatası nedenini bilmek? " Hayır, ama kendine yardım edebilirsin. Sorunun nedenini belirlemek için dokümantasyon başına 'errno’yu kontrol edin. Bunu [okunabilir bir form] [http://stackoverflow.com/q/1546882/1329652] 'de sunduğunuzdan emin olun! –
benim sorumu düzenledi – Subbu
"errno 88" yardımcı olmuyor. 'return' -1 gönderir, başarısız olduğunu gösterir. Platformunuzdaki belgeleri izlerseniz, hatanın nedenini kontrol etmek için 'errno'yu incelemeniz gerektiğini ve" errno 88 "i ingilizce'ye çevirmek için' strerror' komutunu kullanabileceğinizi unutmayın. Yap bunu. –