DOBON.NETプログラミング掲示板過去ログ
RAWソケット送信ぷろぐらむ
題名: RAWソケット送信ぷろぐらむ
著者: Adrian Beltre
日時: 2009/11/12 15:33:29
ID: 25784
この記事の返信元:
(なし)
この記事への返信:
[25792]
Re[1]: RAWソケット送信ぷろぐらむ
(報告)
2009/11/13 0:30:04
ツリーを表示
環境/言語:[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"というエラーが出てきます。どうか対処法が分かる方は書き込みをお願いします。
題名: Re[1]: RAWソケット送信ぷろぐらむ
著者: (報告)
日時: 2009/11/13 0:30:04
ID: 25792
この記事の返信元:
[25784]
RAWソケット送信ぷろぐらむ
Adrian Beltre
2009/11/12 15:33:29
この記事への返信:
(なし)
ツリーを表示
■No25784に返信(Adrian Beltreさんの記事)
> 現在C言語でRAWソケットのプログラムをしています。そして次のプログラムを実行しました。
マルチポスト
http://bbs.wankuma.com/index.cgi?mode=al2&namber=43587
DOBON.NET
|
プログラミング道
|
プログラミング掲示板
分類:[その他]
現在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"というエラーが出てきます。どうか対処法が分かる方は書き込みをお願いします。