想利用原始套接字编写一个可以在发送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---------------------
阅读(524) | 评论(0) | 转发(0) |