Chinaunix首页 | 论坛 | 博客
  • 博客访问: 731964
  • 博文数量: 741
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-18 11:18
文章分类

全部博文(741)

文章存档

2011年(1)

2008年(740)

我的朋友

分类:

2008-09-18 11:23:52

想利用原始套接字编写一个可以在发送UDP数据包时更改源地址的程序,v4下已经成功,但在v6下出现问题,没找到对应v4中setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &flag, sizeof(flag)); 中IP_HDRINCL对应的套接字选项,请大家指点迷津,谢谢!
- ?" c+ U, p* M7 w
! ~5 p/ q5 Y" t  c) W我的代码:
! s8 I% i. q% ^7 g, x8 K$ ^3 c8 Y#define MAX_SIZE 1024- f, ]) B" q! I5 [# `2 Y
int main ( int argc, char **argv )5 T: S: x" h$ P- z& ?3 T
{
: m9 L! r% o3 ^+ c! z7 y! C* F        int sockfd;
# S: G' A* p+ ?% B) u! T, H: r        struct sockaddr_in6 addr;
8 l- ^3 K0 i0 J; n( E! H$ C; f$ p2 ?        memset ( &addr, 0, sizeof ( struct sockaddr_in6 ) );
; z+ ^2 D6 P8 ]7 i' M3 \
6 V: `8 H7 |) J  V0 r, W        unsigned char buffer[ MAX_SIZE ];
/ w0 t0 _; P$ ~* V+ E8 `- v        memset( buffer, 0, MAX_SIZE);
6 `$ T: Z6 X8 Q        int addrlen;0 p/ J' S, p7 Z* Q3 {5 t
# e: N. W% D* u7 w) A  i, d
        const int flag = 1;( P- ]5 c# t0 p. n2 g
        if ( ( sockfd = socket ( PF_INET6, SOCK_RAW, IPPROTO_UDP ) ) < 0 )
/ T- D0 W! `* K4 U( i        {
# j3 t3 D0 X1 G                fprintf ( stderr, "Create Error:%s\n", strerror ( errno ) );
$ n6 S' D% m& |" h- q+ G) A                exit ( 1 );6 H" l$ J% t/ p( Y  j! U, v
        }9 [4 Q# Q9 w3 s' Q$ N+ s# p4 C

% G! ^! }% M6 ~% c/ R' T        setsockopt(sockfd, IPPROTO_IPV6, IP_HDRINCL, &flag, sizeof(flag)); // [ ? ]
1 c6 h8 x3 D1 U* q0 W. j. ?& x
) r: x# w7 @( m6 Y1 U0 S7 G' e        struct ip6_hdr *ip6;
  ?9 [8 E& T( R; K) g0 Z+ u        struct udphdr *udp;2 ]2 I0 l6 d; j
        int head_len = sizeof(struct ip6_hdr) + sizeof(struct udphdr);
3 H/ V" N! z' B" e1 t
" s; ]2 S# g6 L. N3 G( s8 ~        ip6 = (struct ip6_hdr*)buffer;. C( N) c6 J3 ~8 Q4 d2 e
        if ( inet_pton ( AF_INET6, "2001:da8:1001:300::1", &ip6->ip6_src ) <= 0 )  K( w$ J: E: D/ K& }, T
        {
9 _8 B+ F3 D- R4 A1 A( j- X" S9 R                fprintf ( stderr, "Address Error:%s\n", strerror ( errno ) );
& K5 G  @+ W2 }: \! ]                exit ( 1 );( T$ x; N! G5 G, m/ J' [$ f, r
        }
) Y$ e; J4 M" B# K% Q; ~9 ^8 b        if ( inet_pton ( AF_INET6, "2001:da8:1001:230::1", &ip6->ip6_dst ) <= 0 )0 q8 N: Y; Q. Q) o. t+ s9 ^1 b
        {
, [2 Q+ C. c, n# Z- i5 b' C                fprintf ( stderr, "Address Error:%s\n", strerror ( errno ) );' r1 G3 \% W4 m2 k: q
                exit ( 1 );7 w# \8 c+ q4 H! |
        }
# `6 h. m- u% d- c6 y
9 _8 F6 G" @2 a$ b! t2 y        ip6->ip6_plen = htons(head_len);
' j$ M; z: g+ g9 J% M7 L4 Y1 Q, |        ip6->ip6_nxt = IPPROTO_UDP;
- e. G7 R, |" @3 R        ip6->ip6_hlim = 255 ;
# r/ U, c+ h7 ?0 A0 C1 \5 Q3 [9 C' O" q! s: z# E' {
        udp =  (struct udphdr *)(buffer + sizeof(struct ip6_hdr) );
+ c/ d6 ~2 k" S& i7 S        udp->source = htons(8888);
# q2 K9 K  _/ U: t( P8 {        udp->dest = htons(8888);
, q4 M  i7 K/ ~+ b        udp->len = htons(sizeof( struct udphdr ));
& }7 @& f. X7 s9 C, @7 L+ A9 }        udp->check = 0;
, F" d' h/ y) \( n- {+ Q+ v
, ^/ ]% T% L) O/ d8 a        // [ fill the address struct of the socket ]+ R- e; f- D1 _/ m
        addr.sin6_family = AF_INET6;
* `" x4 ?1 C$ z/ A1 r' O& u        addr.sin6_port = htons ( 8888 );; G- v4 d9 g5 V. b; M* p: s$ Z
        if ( inet_pton ( AF_INET6, "2001:da8:1001:230::1", &addr.sin6_addr ) <= 0 )0 ?% V' K3 |& O
        {( o, q8 i+ k9 [6 d
                fprintf ( stderr, "Address Error:%s\n", strerror ( errno ) );) B# \3 }4 Q4 C% ^; j# q, `3 s& D7 V
                exit ( 1 );1 a9 i: X* k( p- H3 ?9 g& g
        }5 |  s6 |% Y& H
        while(1)
% J5 A0 c) J9 O        {
! O" U0 D' E6 G( n$ t0 |' W$ m                addrlen = sizeof ( struct sockaddr_in6 );2 w8 m2 v/ i/ ^1 K3 m" j
                sendto ( sockfd, buffer, head_len, 0, ( struct sockaddr * )&addr, addrlen );
! Q8 b& ?( {+ C# I7 V: A2 ]        }
" _' b; ?! e1 O) m; k: e        close ( sockfd );
+ _, p- s8 d" u7 Q' p( i}
, @4 y+ v% z5 T1 t& S& j  K" z& C0 W
4 W% H4 U2 j; Z/ ^[ 本帖最后由 njngypp 于 2008-9-16 10:57 编辑 ]      
--------------------next---------------------

阅读(497) | 评论(0) | 转发(0) |
0

上一篇:欢迎阅读我的文章

下一篇:2008-9-16 16:21

给主人留下些什么吧!~~