我把代码简单描述一下 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(),没有错误,在解析远程地址时候,就出这个错误。头麻木了。。
求高手帮我讲解一下
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(),没有错误,在解析远程地址时候,就出这个错误。头麻木了。。
求高手帮我讲解一下
retVal = getaddrinfo(addr, TEXT_PORT, &rm_hints, &RemoteInfoText);
-------------------
是不是你解析远程地址的时候getaddrinfo函数失败了,导致后面的出错了呢?
在getaddrinfo()下面紧跟着 int err = GetLatError();
调试根本下不去,得不到Error信息。
直接定义好了
struct addrinfo *RemoteInfoText, *RemoteInfoAudio;
效果是一样的额,我开始以为也是指针设置成NULL的问题,该了还是一样的。
在独立的线程里面,recvfrom收不到包是怎么回事?
返回的错误代码是 10014线程里面的主要代码如下while(TURE)
{
Sleep(100);
DataLen = recvfrom(ListenText, m_prBuffer, 1024, 0, recvAddr->ai_addr, &len);
int err = GetLastError();
if (DataLen > 0)
{
......
}
}
嗯,检测出来了,是我定义了一个对象指针,没有new它。。线程中recvfrom 函数,怎么接受IPv6的地址呢?sockaddr *貌似不行,IPv6的地址128位,需要16个字节来存。
其实说白了你给TA一个较大的就成,管TA里面存的什么呢。基本上所有这些要求传入长度的都是用来限定可用长度的,输出的时候不一定都用满。
我测试本机的,本机的服务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悲剧。。
其中recvAddr是sockaddr_in6 *类型,上面打错了。用的是 sockaddr_in6 *recvAddr = new sockaddr_in6;
我知道是AF_INET6。。但是返回值总是10014真不知道怎么解决了,网上没有相关的。。
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);
...
}这样写,求告诉我错误在哪
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字节。