IPv6下C++网络编程,getaddrinfo出错,求解决

zgame 2011-06-24 03:10:54
我把代码简单描述一下

memset(&rm_hints, 0, sizeof(rm_hints));
rm_hints.ai_family = AF_UNSPEC;
// rm_hints.ai_family = AF_INET6;
rm_hints.ai_socktype = SOCK_DGRAM;
rm_hints.ai_protocol = IPPROTO_UDP;
rm_hints.ai_flags = AI_CANONNAME;

// 解析远程IP地址
retVal = getaddrinfo(addr, TEXT_PORT, &rm_hints, &RemoteInfoText);

调试时候,总是有个Unhandled Exception : 0xC0000005 Aceess Violation.

其中我的 rm_hints 和 RemoteInfoText 是如下定义的。

struct addrinfo rm_hints;
struct addrinfo *RemoteInfoText = NULL, *RemoteInfoAudio = NULL;


在创建本地监听线程的时候,也用到了getaddrinfo(),没有错误,在解析远程地址时候,就出这个错误。头麻木了。。
求高手帮我讲解一下
...全文
339 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgame 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hmm7e 的回复:]
sockaddr_in6 看看你的头文件里定义的结构体大小是否为28,如果不是的话,那么就改成下面的方法吧。

C/C++ code


sockaddr_in6 *recvAddr = (sockaddr_in6 *)new char[32];
int AddrLen = 32;
while(TRUE)
{

Sleep(100);
// DataLen = recvfrom……
[/Quote]

崇拜你,大神。。。。

地址是能接受到了,多少只能收到4个字节以内的数据。。。
不管怎么样,地址问题是解决了。。。

谢谢你了。。。
「已注销」 2011-06-25
  • 打赏
  • 举报
回复

sockaddr_in6 看看你的头文件里定义的结构体大小是否为28,如果不是的话,那么就改成下面的方法吧。



sockaddr_in6 *recvAddr = (sockaddr_in6 *)new char[32];
int AddrLen = 32;
while(TRUE)
{

Sleep(100);
// DataLen = recvfrom(ListenText, m_prBuffer, 1024, 0, (sockaddr *)recvAddr, &AddrLen);
...
}



其它解决方法:把平台版本升高(在工程的所有include之前写。)


#ifndef WINVER
#define WINVER 0x0501
#endif

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif



旧版本的 sockaddr_in6 只有24字节,实际需要的是28字节。

zgame 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hmm7e 的回复:]

线程中recvfrom 函数,怎么接受IPv6的地址呢?sockaddr *貌似不行,IPv6的地址128位,需要16个字节来……
[/Quote]

其中recvAddr是sockaddr_in6 *类型,上面打错了。

用的是 sockaddr_in6 *recvAddr = new sockaddr_in6;
zgame 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hmm7e 的回复:]

10014 == 系统检测到在一个调用中尝试使用指针参数时的无效指针地址。
[/Quote]


sockaddr_in6 *recvAddr = new sockaddr_in6;
int DataLen;
CString strText, strTime;
int AddrLen = sizeof(sockaddr_in6);
char m_prBuffer[1024];
CTime tm;

while(TRUE)
{
Sleep(100);
// DataLen = recvfrom(ListenText, m_prBuffer, 1024, 0, (sockaddr *)recvAddr, &AddrLen);
...
}

这样写,求告诉我错误在哪
zgame 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hmm7e 的回复:]

嗯,检测出来了,是我定义了一个对象指针,没有new它。。

线程中recvfrom 函数,怎么接受IPv6的地址呢?sockaddr *貌似不行,IPv6的地址128位,需要16个字节来……
[/Quote]

我测试本机的,本机的服务socket
根据getaddrinfo(NULL, TEXT_PORT, &hints, &LocalInfoText); 返货的LocalInfoText创建的,bind()之后,
我输入“::1”,自己给自己发送数据,
DataLen = recvfrom(ListenText, m_prBuffer, 1024, 0, (sockaddr *)recvAddr, &AddrLen);
int err = GetLastError();
(其中recvAddr是sockaddr_in6 类型,AddrLen是sizeof(sockaddr_in6))
收不到数据。。DataLen的值总是 -1
err是值是10014。。。

悲剧。。。。。
「已注销」 2011-06-25
  • 打赏
  • 举报
回复
10014 == 系统检测到在一个调用中尝试使用指针参数时的无效指针地址。
「已注销」 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gateway_xiaozhu 的回复:]

引用 6 楼 fishion 的回复:

系统检测到在一个调用中尝试使用指针参数时的无效指针地址。


这个你要好好检查一下


嗯,检测出来了,是我定义了一个对象指针,没有new它。。

线程中recvfrom 函数,怎么接受IPv6的地址呢?sockaddr *貌似不行,IPv6的地址128位,需要16个字节来存。
[/Quote]


sockaddr_in6 a ;

(sockaddr *)&a,sizeof(sockaddr_in6)


其实说白了你给TA一个较大的就成,管TA里面存的什么呢。基本上所有这些要求传入长度的都是用来限定可用长度的,输出的时候不一定都用满。
zgame 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fishion 的回复:]

系统检测到在一个调用中尝试使用指针参数时的无效指针地址。


这个你要好好检查一下
[/Quote]

嗯,检测出来了,是我定义了一个对象指针,没有new它。。

线程中recvfrom 函数,怎么接受IPv6的地址呢?sockaddr *貌似不行,IPv6的地址128位,需要16个字节来存。
fishion 2011-06-25
  • 打赏
  • 举报
回复
系统检测到在一个调用中尝试使用指针参数时的无效指针地址。


这个你要好好检查一下
zgame 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hmm7e 的回复:]

引用 10 楼 gateway_xiaozhu 的回复:

引用 8 楼 hmm7e 的回复:

线程中recvfrom 函数,怎么接受IPv6的地址呢?sockaddr *貌似不行,IPv6的地址128位,需要16个字节来……


其中recvAddr是sockaddr_in6 *类型,上面打错了。

用的是 sockaddr_in6 *recvAddr = new sock……
[/Quote]

我知道是AF_INET6。。但是返回值总是10014。。。真不知道怎么解决了,网上没有相关的。。
「已注销」 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gateway_xiaozhu 的回复:]

引用 8 楼 hmm7e 的回复:

线程中recvfrom 函数,怎么接受IPv6的地址呢?sockaddr *貌似不行,IPv6的地址128位,需要16个字节来……


其中recvAddr是sockaddr_in6 *类型,上面打错了。

用的是 sockaddr_in6 *recvAddr = new sockaddr_in6;
[/Quote]

AF_INET6
zgame 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]

你设置成NULL,干嘛

struct addrinfo *RemoteInfoText = NULL, *RemoteInfoAudio = NULL;


直接定义好了
struct addrinfo *RemoteInfoText, *RemoteInfoAudio;
[/Quote]

在独立的线程里面,recvfrom收不到包是怎么回事?
返回的错误代码是 10014

线程里面的主要代码如下

while(TURE)
{
Sleep(100);
DataLen = recvfrom(ListenText, m_prBuffer, 1024, 0, recvAddr->ai_addr, &len);
int err = GetLastError();
if (DataLen > 0)
{
......
}

zgame 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]

你设置成NULL,干嘛

struct addrinfo *RemoteInfoText = NULL, *RemoteInfoAudio = NULL;


直接定义好了
struct addrinfo *RemoteInfoText, *RemoteInfoAudio;
[/Quote]

效果是一样的额,我开始以为也是指针设置成NULL的问题,该了还是一样的。
oyljerry 2011-06-24
  • 打赏
  • 举报
回复
你设置成NULL,干嘛

struct addrinfo *RemoteInfoText = NULL, *RemoteInfoAudio = NULL;


直接定义好了
struct addrinfo *RemoteInfoText, *RemoteInfoAudio;

zgame 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]

// 解析远程IP地址
retVal = getaddrinfo(addr, TEXT_PORT, &rm_hints, &RemoteInfoText);
-------------------
是不是你解析远程地址的时候getaddrinfo函数失败了,导致后面的出错了呢?
[/Quote]

在getaddrinfo()下面紧跟着 int err = GetLatError();
调试根本下不去,得不到Error信息。
Eleven 2011-06-24
  • 打赏
  • 举报
回复
// 解析远程IP地址
retVal = getaddrinfo(addr, TEXT_PORT, &rm_hints, &RemoteInfoText);
-------------------
是不是你解析远程地址的时候getaddrinfo函数失败了,导致后面的出错了呢?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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