私のアプリケーションでTCP SYNパケットを作成し、ネットワークで送信します。カーネルにIPヘッダーを書き込ませたいので、私はIP_HDRINCL
をsetsockopt
に設定していませんでした。C - rawソケットを使用してIPヘッダを埋めることなくTCP SYNを作成する
私はIPヘッダ+ TCPヘッダ+ペイロードが含まれるようにバイトのバッファを使用してTCPヘッダ+ペイロード
- を試してみました。
どちらの上記の方法はsendto
エラーを返し-1 errnoが、私はsendto
エラー-1およびerrnoが88を取得していますなぜ私は
#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;
}
を使用したコードされた後88 に設定されていますか? また、sendto
関数の2番目の引数で使用されるデータの長さを決定する方法を知りたいと思います。パケットバイトバッファ、つまり512バイトのサイズにハードコードすると間違っていますか?
..エラーの意味を与えますsendtoエラーの背後にある理由を知っていますか? "いいえ、でも自分で助けることができます。ドキュメントごとに 'errno'をチェックして、問題の原因を調べます。それを[人間が読める形式](http://stackoverflow.com/q/1546882/1329652)で提示してください! –
編集した質問 – Subbu
「errno 88」は役に立ちません。 -1を返す 'sendto'は単にそれが失敗したことを示します。あなたのプラットフォームのドキュメントに従うならば、エラーの原因を調べるために 'errno'を調べなければならないことに気付くでしょうし、' strerror'を使って "errno 88"を英語に翻訳することができます。それを行う。 –