标题: 【求助】Linux IPv6网络通信
sunxpa
新生入学
Rank: 1
注册用户



UID 178818
精华 0
积分 0(积分有什么用?)
帖子 2
阅读权限 10
注册 2007-1-11
状态 离线
发表于 2007-1-12 10:12  资料  个人空间  短消息  加为好友 
【求助】Linux IPv6网络通信

本人正在从事IPv6研究,最近编了一个Linux IPv6 的UDP客户端和服务端程序,其基础是以前可以运行的v4程序之上改编成v6的。我的PC环境是Linux 2.4.18-20,支持IPv6,支持IPv4和ipv6,经过地址配置后可以与另外一台PC相互ping通。当我用编写的程序在一台PC机上测试时,服务端程序接收不到数据,当在两台PC机上测试时,出现如下错误信息:

EPP#H)|2by0S,t;N8O
  bind:Cannot assign requested address"b;M0s/ozxZ9q
由于本人多年从事Linux软件开发,编写UDP通讯程序应该是很简单的问题,现在出现上述情况,让我很困惑,不知问题出现在何处?请各位有经验的高手指点一下,并回答下述问题,谢谢!n"z@.T3D
Ux3Oc

(1)除地址结构和地址解析的差异外,IPv6和IPv4在网络编程方面到底有什么差异?
`(x+vk/^ p(2)既然能够ping通对方的IPv6地址,但为什么会绑定错误,是不是在配置方面要作其它工作?

顶部
flag
版主
Rank: 7Rank: 7Rank: 7
版主



UID 19801
精华 1
积分 28(积分有什么用?)
帖子 5581
阅读权限 100
注册 2002-7-19
状态 离线
发表于 2007-1-12 10:49  资料  个人空间  短消息  加为好友 
呵呵,no code no talk





上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。
顶部
sunxpa
新生入学
Rank: 1
注册用户



UID 178818
精华 0
积分 0(积分有什么用?)
帖子 2
阅读权限 10
注册 2007-1-11
状态 离线
发表于 2007-1-12 15:28  资料  个人空间  短消息  加为好友 
帮忙分析Linux IPv6 通讯代码

服务端程序如下:
%`&ph6d6X:~bU+MY#include <sys/types.h>
EH!vqzLinux伊甸园论坛#include <sys/socket.h>
|h2uuF3{Linux伊甸园论坛#include <sys/poll.h>www.linuxeden.combG:BwSL(J8D
#include <sys/ipc.h>6SOh4n#F
#include <sys/ioctl.h>-lGI$R"]b
}2sV

#include <sys/select.h>
C/BSlo)ch2^#include <sys/shm.h>boQ1wtT6TJ
#include <sys/un.h>UeBw|-\1?
#include <netinet/in.h>
gw6z7{ z`F_S;`Nwww.linuxeden.com#include <arpa/inet.h>c-h P2SlIT+V
#include <stdio.h>www.linuxeden.coma0Wg)[2ojE
#include <unistd.h>
C'n:B EPYez%g#x#include <stdlib.h>
        W$LT|*c#include <string.h>
7oF}-l(oZ#include <errno.h>
gwoKPMint main ()
"v7B#VgAcg{;Dp tQ c:Y)B
int sock,sockfd;
]w^;I E/Hi"L unsigned char v6[16];
U7j;LK        Z struct sockaddr_in6 addr,servaddr;
#]%INWp*F6[3z'o)WAwww.linuxeden.com socklen_t fromlen;c$~:x1Km1P&_._1PX
char packetbuffer[1024];*O.q1Zti
int size;
jPp&E|3W.pY} size_t len;0VT"Z1gy'g
L

// create sockets
u1e5sh-Lsb
s
F/j(Z6UqYl-CU
sock = socket(PF_INET6,SOCK_DGRAM,0);Linux伊甸园论坛p5w/{+ke;x
v

if (sock == -1)www.linuxeden.com
g4Qn1e,oaNN        wX[h

{Linux伊甸园论坛D:V|m~.r
  printf(" create socket error\n");Linux伊甸园论坛3q;IK m3j(S/P;AD
  exit(-1);
a7e        O wd;Uw }Linux伊甸园论坛}?F
ug E4[T

printf("Create socket 6 =%d\n",sock);www.linuxeden.com4v-g!c.e+Z
r
F

// bind sockets
cZT0h$A$B memset(&addr,0,sizeof(struct sockaddr_in6));QD,`}(m;[dT^.Uc;|K
addr.sin6_family = AF_INET6;
@6U+W`2N2m1i7sr addr.sin6_port = htons(9000);
}vFpPc${ G3_*sxwww.linuxeden.com if (inet_pton (AF_INET6, "3ffe:321f::50a", &addr.sin6_addr) <= 0) {;h6[%J/\t
  printf ("inet_pton error \n");Linux伊甸园论坛 OON q:vh
P8U

  exit (3);
2d X
o{5u:MA
}M4jv9|.T[W1N1_c
if (bind(sock,(struct sockaddr *)&addr,sizeof(addr)) != 0)
JH-G8f
l!RH
{
+yjLT*qT8U  printf("bind udp6 rtp error!\n");
B"xweg#`
kb
]7`
  exit(-1);

k[]3I/y DM
}
$sb+_w$|
L1A
printf("Wait receive data ....\n");/W]j
r kZ%gm!K4b%_

fromlen = sizeof( struct sockaddr_in6 );
f,E1K3P7Hx+y,zL2B8ULinux伊甸园论坛     //int rcvtimeo = 30000 ; // 45 sec insteadof 45 as default
]]&DAN:g)jz@     //setsockopt(sock, SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo , sizeof(rcvtimeo) );
,V*@"kkO:Xi$W while(1)?IVh(P0N
{_        V){aW_        d
  int recvlen=0;
2B1dO*AvrS  recvlen = recvfrom(sock,packetbuffer,1024,0,(struct sockaddr *)&servaddr,&fromlen);
0?c_?3~
cRd+oJ-r'dwww.linuxeden.com
  if ( recvlen <0 )
/h%f{;i
K3J)b \S(M
   continue;\g(^'l#Y] e$Z
  else0Gut
gD3fW

  {
R
GJ#T4P9ndwww.linuxeden.com
   printf("Receive msg>>%s\n",packetbuffer);Linux伊甸园论坛ZTI6z4^-^sJ
   break;
#a!Y2C+q-K0e]Linux伊甸园论坛  }
DS J@VET|SJwww.linuxeden.com }E's"b"i~a
close(sock);
G"m!F:\'^www.linuxeden.com return 0;
L"K|:BjD's8SLinux伊甸园论坛} h!F+K2\dV
发送端程序如下:
^5g&V
dPG/^!`*x)jwww.linuxeden.com
#include <sys/types.h>
w#kBgWh(V X#include <sys/socket.h>
8gb|4sG^z J#include <sys/poll.h>Linux伊甸园论坛q)cu_C
#include <sys/ipc.h>.IJ5F,m q
#include <sys/shm.h>
pk;y@R^u&h.hQ#include <sys/un.h>www.linuxeden.comh{mg&~
#include <netinet/in.h>www.linuxeden.com7I$e7q Fb8R\~
#include <arpa/inet.h>
'n&XZ,rgLinux伊甸园论坛#include <stdio.h>
&B ]#A,SG        Y-N3?nwww.linuxeden.com#include <unistd.h>{i ^0m$[
#include <stdlib.h>2?7R
q?"Z"L        uNG

#include <string.h>J2m*q3dI}iZ
#include <errno.h> r1{7a;U(o E
int main ()
(L%\!g0G/uq0r{|'FBB
K$\ j8@+h

int sockfd;A#n8z:ADw"y
struct sockaddr_in6 servaddr;"rE']yVq+WNh2I9X
printf("socket\n"); I.[-b6c"L8_#Gh
D

if ((sockfd = socket (AF_INET6, SOCK_DGRAM, 0)) < 0) {.E.u5HA+o.`
  perror ("socket");www.linuxeden.com
l/_}"V3^,H@9]

  exit (2);Linux伊甸园论坛
\
fx2G/f)V

}Linux伊甸园论坛Os(eq-IQ
printf("sock=%d\n",sockfd);
~7K!Q%C+b0Fm7uq~Linux伊甸园论坛 bzero (&servaddr, sizeof (servaddr));www.linuxeden.com
n9Xe
m0q

servaddr.sin6_family = AF_INET6;
P.a3V6} S(c8Pt(qv r servaddr.sin6_port = htons (8000);D
k{rO}+A7MF3I!S

if (inet_pton (AF_INET6, "3ffe:321f::50a", &servaddr.sin6_addr) <= 0) {:gI)V{gG
  printf ("inet_pton error\n");{#n`^-qYIC
  exit (3);
I,P,}6u)zhpL }3d^[B9mg
if (bind (sockfd, (struct sockaddr *)&servaddr, sizeof (servaddr)) < 0)
Y!u,x.}3NP8j  {
.uCR2^S'M;?@Ico?  perror ("bind");gX%hpS)cf
  exit (4);
ef;T+SK6MDh[ })E2HVH$Lr*M
printf("sendto\n");1TCs)e2bK h-eG
sendto(sockfd, "123456789", 9, 0, (struct sockaddr *)&servaddr, sizeof(struct sockaddr_in6));.X$U!zo9XQ:r0Kx
close (sockfd);
e
`H[^F!H,`Linux伊甸园论坛
return 0;Linux伊甸园论坛^{2AVe5H
}

顶部
不容错过的IBM 集群技术资源汇总
flag
版主
Rank: 7Rank: 7Rank: 7
版主



UID 19801
精华 1
积分 28(积分有什么用?)
帖子 5581
阅读权限 100
注册 2002-7-19
状态 离线
发表于 2007-1-12 15:44  资料  个人空间  短消息  加为好友 
看地址格式似乎不象是标准的,前阵搞过 IPv6,似乎是f开头的。不过IPv6的地址结构是比较复杂,建议楼主研究一下。





上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。
顶部
lelecool
新生入学
Rank: 1
注册用户



UID 148624
精华 0
积分 0(积分有什么用?)
帖子 3
阅读权限 10
注册 2006-1-28
状态 离线
发表于 2007-7-2 19:56  资料  个人空间  短消息  加为好友 
地址没有问题....

顶部
不容错过的IBM 集群技术资源汇总
Clerk_9919
小试牛刀
Rank: 2
注册用户



UID 599
精华 0
积分 1(积分有什么用?)
帖子 138
阅读权限 10
注册 2001-2-26
状态 离线
发表于 2007-7-9 13:28  资料  个人空间  短消息  加为好友 
可能是你的本地路由不正确,在你Ping的时候你可以指定接口所以可以Ping通,在代码重却没有所以不能收到数据。只要加上此IP使用哪个接口的静态路由就应该可以了。

顶部
Clerk_9919
小试牛刀
Rank: 2
注册用户



UID 599
精华 0
积分 1(积分有什么用?)
帖子 138
阅读权限 10
注册 2001-2-26
状态 离线
发表于 2007-7-9 13:33  资料  个人空间  短消息  加为好友 
你确认端口没有被占用么

顶部
不容错过的IBM 集群技术资源汇总
 



当前时区 GMT+8, 现在时间是 2008-5-16 15:55

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.094184 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP