首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

ipv6只能向本机发送消息,无法向别的机器发送消息,ing

2012-11-07 
ipv6只能向本机发送消息,无法向别的机器发送消息,求助ing各位,我写了一个利用 ipv6 进行udp通信的小程序,

ipv6只能向本机发送消息,无法向别的机器发送消息,求助ing
各位,我写了一个利用 ipv6 进行udp通信的小程序,但遇到了一个问题,发往本机的消息可以收到,但发往别的机器的消息接收不到,没能找到原因,望各位高手帮忙瞅一下,我是第一次写网络通信程序:

我的 ipv6 地址(客户端在我机器上,服务端 A 在我机器上):fe80::2c42:6fb2:a162:85ed%10
另一台机器的 ipv6 地址(服务端 B):fe80::706d:5cb0:fcac:7141%11
服务端 A 与服务端 B 都是一样的代码,客户端向两个服务端各发一条信息,但只有我电脑上的服务端 A 收到了消息。

**************************
客户端代码:udp_client.cpp
**************************

C/C++ code
#include<stdio.h>#include<winsock2.h>#include<ws2tcpip.h>//在编译采用了WINSOCK2.H的应用程序时,需要链接到WS2_32.LIB库  #pragma comment(lib, "WS2_32.LIB")  int main(int argc, char* argv[]){    WORD wVersionRequested;    WSADATA wsaData;    int err;        //启动 winsockAPI    wVersionRequested = MAKEWORD(1, 1);    err = WSAStartup(wVersionRequested,  &wsaData);    if (err != 0) {        printf("WSAStartup failed.\n");        system("pause");        return -1;    }    if (LOBYTE(wsaData.wVersion) != 1||        HIBYTE(wsaData.wVersion) != 1) {            WSACleanup();            printf("LOBYTE or HIBYTE failed.\n");            system("pause");            return -2;    }    //创建套接字    addrinfo hints;    addrinfo *otherinfo;    addrinfo *meinfo;    memset(&hints, 0, sizeof(hints));    hints.ai_family        = AF_INET6;            // 使用ipv6协议    hints.ai_socktype    = SOCK_DGRAM;    hints.ai_protocol    = IPPROTO_UDP;    hints.ai_flags        = AI_NUMERICHOST;    // IP用数字表示    getaddrinfo("fe80::706d:5cb0:fcac:7141%11", "2012", &hints, &otherinfo);    getaddrinfo("fe80::2c42:6fb2:a162:85ed%10", "2012", &hints, &meinfo);    SOCKET s;    s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);    if(s == INVALID_SOCKET)    {        WSACleanup();        printf("Create socket failed.\n");        system("pause");        return -3;    }    //发送消息    char buf[]="Hello, my name is zhcosin.";    // 向另一台机器发送    err = sendto(s, buf, strlen(buf), 0, otherinfo->ai_addr, otherinfo->ai_addrlen);    if(err == SOCKET_ERROR)    {        WSACleanup();        printf("Send to other failed.\n");        system("pause");        return -5;    }    // 向本机发送    err = sendto(s, buf, strlen(buf), 0, meinfo->ai_addr, meinfo->ai_addrlen);    if(err == SOCKET_ERROR)    {        WSACleanup();        printf("Send to me failed.\n");        system("pause");        return -5;    }    closesocket(s);    freeaddrinfo(otherinfo);    freeaddrinfo(meinfo);    system("pause");}


************************
服务端代码: udp_server.cpp
************************
C/C++ code
#include<stdio.h>#include<winsock2.h>#include<ws2tcpip.h>//在编译采用了WINSOCK2.H的应用程序时,需要链接到WS2_32.LIB库  #pragma comment(lib, "WS2_32.LIB") int main(int argc, char* argv[]){    WORD wVersionRequested;    WSADATA wsaData;    int err;    wVersionRequested = MAKEWORD( 1,  1 );    err = WSAStartup( wVersionRequested,  &wsaData );    if ( err != 0 ) {        printf("WSAStartup failed.\n");        return -1;    }    if ( LOBYTE( wsaData.wVersion ) != 1||        HIBYTE( wsaData.wVersion ) != 1 ) {            WSACleanup( );            printf("LOBYTE or HIBYTE failed.\n");            return -2;    }    //创建套接字//    addrinfo hints;    addrinfo *res;    memset(&hints, 0, sizeof(hints));    hints.ai_flags= AI_PASSIVE;    hints.ai_family=AF_INET6;    hints.ai_socktype=SOCK_DGRAM;    hints.ai_protocol=IPPROTO_UDP;        getaddrinfo("::0", "2012", &hints, &res);    SOCKET s;    s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);    if(s == INVALID_SOCKET)    {        WSACleanup();        printf("Create socket failed.\n");        return -3;    }    //绑定套接字//    err = bind(s, res->ai_addr, res->ai_addrlen);    if(err == SOCKET_ERROR)    {        WSACleanup();        printf("Bind socket failed.\n");        return -4;    }    char buf[1024];    memset(buf, 0, 1024);    int len;    sockaddr_in6 sin;    len = sizeof(sin);    err = recvfrom(s, buf, 1024, 0, (struct sockaddr*)&sin, &len);    if(err == SOCKET_ERROR)    {        closesocket(s);        WSACleanup();        printf("Receive failed.\n");        return -5;    }    char ipbuf[INET6_ADDRSTRLEN];    inet_ntop(AF_INET6,  &sin.sin6_addr,  ipbuf,  INET6_ADDRSTRLEN);    printf("We successfully received %d bytes from address %s:%d.\nmessage:%s\n",  err,           ipbuf,  ntohs(sin.sin6_port), buf);    freeaddrinfo(res);    closesocket(s);    system("pause");    } 



[解决办法]
把%11去掉试试,这只在本机才有意义吧。这里有些WinSock代码,可以参考:
http://download.csdn.net/detail/geoff08zhang/4571358
[解决办法]
%10
%11
不是IPv6地址的一部分。

热点排行