DOBON.NET DOBON.NETプログラミング掲示板過去ログ

RAWソケット送信ぷろぐらむ

環境/言語:[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"というエラーが出てきます。どうか対処法が分かる方は書き込みをお願いします。
■No25784に返信(Adrian Beltreさんの記事)
> 現在C言語でRAWソケットのプログラムをしています。そして次のプログラムを実行しました。

  マルチポスト
  http://bbs.wankuma.com/index.cgi?mode=al2&namber=43587

DOBON.NET | プログラミング道 | プログラミング掲示板