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地址的一部分。