ipv6套接字绑定错误,求大神......

zhcosin 2012-10-19 11:29:57

#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");
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 *res;
memset(&hints, 0, sizeof(hints));
hints.ai_family=AF_INET6;
//hints.ai_family = PF_INET6;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
hints.ai_flags = AI_NUMERICHOST;
getaddrinfo("fe80::706d:5cb0:fcac:7141", "7999", &hints, &res);
//getaddrinfo(NULL, "8700", &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");
system("pause");
return -3;
}

//绑定套接口
err = bind(s, res->ai_addr, res->ai_addrlen);
if(err == SOCKET_ERROR)
{
WSACleanup();
printf("Bind socket failed.\n");
system("pause");
return -4;
}

//发送消息
char buf[]="Hello, my name is zhcosin.";
err = sendto(s, buf, strlen(buf), 0, res->ai_addr, res->ai_addrlen);
if(err == SOCKET_ERROR)
{
WSACleanup();
printf("Send failed.\n");
system("pause");
return -5;
}

closesocket(s);

system("pause");
}

编译没问题,运行的时候进入到了套接字绑定错误处理的那部分代码了,求帮助啊
运行输出如下:
Bind socket failed.
Press any key to continue......
...全文
233 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2012-10-22
  • 打赏
  • 举报
回复
服务端要用 AI_PASSIVE
hints.ai_flags = AI_PASSIVE
zhcosin 2012-10-22
  • 打赏
  • 举报
回复
现在改成这样了,但是运行的时候有个问题:客户端代码显示成功发送了,但是服务端没有收到,抓包也没抓到
===============
客户端代码:
===============

#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 *res;
addrinfo *curinfo;
memset(&hints, 0, sizeof(hints));
//hints.ai_family = AF_INET6;
hints.ai_family = PF_INET6;
hints.ai_socktype = SOCK_DGRAM;
//hints.ai_protocol = IPPROTO_UDP;
hints.ai_flags = AI_NUMERICHOST;
//hints.ai_flags = AI_PASSIVE;
getaddrinfo("::0", "7999", &hints, &res);
getaddrinfo("fe80::2c42:6fb2:a162:85ed%10", "7999", &hints, &curinfo);


SOCKET s;
//s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
if(s == INVALID_SOCKET)
{
WSACleanup();
printf("Create socket failed.\n");
system("pause");
return -3;
}

//struct sockaddr_in6 destAddr;
//destAddr.sin6_family = AF_INET6;
//destAddr.sin6_port = 7000;
//inet_pton(AF_INET6, "fe80::706d:5cb0:fcac:7141%11", &(destAddr.sin6_addr));

//绑定套接字
err = bind(s, res->ai_addr, res->ai_addrlen);
if(err == SOCKET_ERROR)
{
WSACleanup();
printf("Bind socket failed.\n");
system("pause");
return -4;
}

//发送消息
char buf[]="Hello, my name is zhcosin.";
err = sendto(s, buf, strlen(buf), 0, curinfo->ai_addr, curinfo->ai_addrlen);
//err = sendto(s, buf, strlen(buf), 0, (SOCKADDR *)&destAddr, sizeof(destAddr));
if(err == SOCKET_ERROR)
{
WSACleanup();
printf("Send failed.\n");
system("pause");
return -5;
}

closesocket(s);

freeaddrinfo(res);
freeaddrinfo(curinfo);

system("pause");
}



==================
服务端代码
==================

#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_family=AF_INET6;
hints.ai_socktype=SOCK_DGRAM;
hints.ai_protocol=IPPROTO_UDP;
hints.ai_flags=AI_NUMERICHOST;
getaddrinfo(NULL,"7999",&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];
int len;
sockaddr_in6 sin;
len = sizeof(sin);
err = recvfrom(s,buf,sizeof(buf),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./n", err,
ipbuf, ntohs(sin.sin6_port));

closesocket(s);

system("pause");
}
zhcosin 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

服务端要用 AI_PASSIVE
hints.ai_flags = AI_PASSIVE
[/Quote]
问题解决了,除了要把服务端的 hints.ai_flags 改为 AI_PASSIVE 之外,还有客户端的套接字是不需要绑定的,这样就收到了。
谢谢你的连续帮助,深表感谢。^_^
zhcosin 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

服务端要用 AI_PASSIVE
hints.ai_flags = AI_PASSIVE
[/Quote]
改了,问题依旧,客户端代码成功发送了,可服务端没有收到........你看我下面这两行代码有无问题:
<in file udp_client.cpp>

getaddrinfo("::0", "2012", &hints, &res);
getaddrinfo("fe80::2c42:6fb2:a162:85ed%10", "2012", &hints, &curinfo);
mymtom 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

对于fe80::的地址在绑定的时候必须标明接口地址,即使用fe80::20d:60ff:fe78:51c2%4或fe80::1%1这样的地址格式,通过getaddrinfo直接取出fe80地址好像无法直接bind。
[/Quote]
++
用ipconfig看看接口id是什么
Linux下类似一下的格式
fe80::20d:60ff:fe78:51c2%eth0
mymtom 2012-10-19
  • 打赏
  • 举报
回复
看看什么错误
赵4老师 2012-10-19
  • 打赏
  • 举报
回复
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_fxnetwork/html/e6fa8ebd-010a-4c48-a5ec-a5102c53c06f.htm
zhcosin 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

试试
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
hints.ai_flags = AI_NUMERICHOST
改为
hints.ai_socktype = SOCK_DGRAM;
// hints.ai_protocol ……
[/Quote]
上面说错了,挂掉的原因是我把 getaddrinfo 这个函数的调用也注释掉了,但是这样还是不行,还是绑定失败........
zhcosin 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

对于fe80::的地址在绑定的时候必须标明接口地址,即使用fe80::20d:60ff:fe78:51c2%4或fe80::1%1这样的地址格式,通过getaddrinfo直接取出fe80地址好像无法直接bind。
[/Quote]
谢谢,我在网上也找到了这样的说明,确实不能这样,但是该怎么设置这个发送目的地 ip 地址和端口还没找到答案........
zhcosin 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

试试
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
hints.ai_flags = AI_NUMERICHOST
改为
hints.ai_socktype = SOCK_DGRAM;
// hints.ai_protocol ……
[/Quote]
这样也不行啊,编译通过,但运行时创建套接字的时候就直接挂掉了,无论注释还是不注释掉协议那一行都是这样。
mymtom 2012-10-19
  • 打赏
  • 举报
回复
试试
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
hints.ai_flags = AI_NUMERICHOST
改为
hints.ai_socktype = SOCK_DGRAM;
// hints.ai_protocol = IPPROTO_UDP;
hints.ai_flags = AI_PASSIVE
zhcosin 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

对于fe80::的地址在绑定的时候必须标明接口地址,即使用fe80::20d:60ff:fe78:51c2%4或fe80::1%1这样的地址格式,通过getaddrinfo直接取出fe80地址好像无法直接bind。
[/Quote]
我试过用 fe80::20d:60ff:fe78:51c2%11,问题是一样的............
如果无法直接 bind,那该怎么做?
xiaoxiao8310 2012-10-19
  • 打赏
  • 举报
回复
对于fe80::的地址在绑定的时候必须标明接口地址,即使用fe80::20d:60ff:fe78:51c2%4或fe80::1%1这样的地址格式,通过getaddrinfo直接取出fe80地址好像无法直接bind。
zhcosin 2012-10-19
  • 打赏
  • 举报
回复
求助啊.........

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧