|
分類:[C/C++]
現在C言語でRAWソケットのプログラムをしています。そして次のプログラムを実行しました。
//Copyright(c) 2003-2004, shira. //All rights reserved.
#include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include "ip.h"
void printusage(char *); void printbit(int, int);
int main(int argc, char *argv[]) { struct sockaddr_in sin; struct in_addr src; struct ip *ip; int sock; int res; int on=1;
//入力チェック if(argc!=3) { printusage(argv[0]); exit(1); }
memset(&sin, 0, sizeof(struct sockaddr_in)); src.s_addr=inet_addr(argv[1]); sin.sin_family=PF_INET; sin.sin_addr.s_addr=inet_addr(argv[2]); sin.sin_port=0;
/* ソケットの作成 */ sock=socket(PF_INET, SOCK_RAW, IPPROTO_RAW); if(sock==-1) { perror("socket()"); exit(1); }
/* ソケットのオプションの設定 */ res=setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &on, sizeof(int)); if(res==-1) { perror("setsockopt"); exit(1); }
/* パケットのバッファ確保 */ ip=(struct ip *)malloc(sizeof(struct ip));
/* IP Header */ ip->iph.ip_v = 4; ip->iph.ip_ihl = sizeof(struct ip_header)/4; ip->iph.ip_tos = 0; ip->iph.ip_len = htons(sizeof(struct ip)); ip->iph.ip_id = htons(242); ip->iph.ip_off = htons(0x4000); ip->iph.ip_ttl = 255; ip->iph.ip_p = IPPROTO_RAW; ip->iph.ip_sum = 0; ip->iph.ip_src.s_addr = src.s_addr; ip->iph.ip_dst.s_addr = sin.sin_addr.s_addr; /* IP Header Option */ ip->iph.ip_opt.opt_flag=0xA0; ip->iph.ip_opt.opt_len=sizeof(struct ip_option); ip->iph.ip_opt.opt_data=0x00;
/* Headerの出力 */ printheader(ip);
/* パケットの送信 */ res=sendto(sock, ip, sizeof(struct ip), 0, (struct sockaddr *) &sin, sizeof(sin)); if(res==-1) { perror("sendto()"); exit(1); } }
void printusage(char * p_name) { printf("Usage: %s [Source IP] [Destination IP]\n", p_name); printf("\n"); }
そしたら、普通は上手くいくはずがいつも"sendto() Message too long"というエラーが出てきます。どうか対処法が分かる方は書き込みをお願いします。
|