在 WinCE 下使用 JRTPLIB 时 Socket 函数 ioctlsocket 出错,请大家帮忙看看

91program
博客专家认证
2013-03-19 05:30:49
WinCE 系统,在 Debug 模式下调试 JRTPLIB 时,接收数据弹框。

#define RTPIOCTL ioctlsocket

unsigned long len;

len = 0;
RTPIOCTL(sock,FIONREAD,&len);
if (len <= 0)
return 0;


单步调试到 RTPIOCTL(sock,FIONREAD,&len); 时出错。
串口有如下输出:
Exception 'Data Abort' (4): Thread-Id=06650066(pth=9155c648), Proc-Id=06c20062(pprc=8d56c6c0) 'CallSample1.exe', VM-active=06c20062(pprc=8d56c6c0) 'CallSample1.exe'
PC=402455c8(ws2.dll+0x000055c8) RA=000350b4(CallSample1.exe+0x000250b4) SP=001bfd34, BVA=001bfd2c
...全文
834 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nvcmc 2013-08-12
  • 打赏
  • 举报
回复
RTP 端口不是偶数
91program 2013-03-25
  • 打赏
  • 举报
回复
没有搞定,UDP 部分自己写。 RTP 组包也自己写,绕过这个问题。但工作量大了一些!~ 结帖。。。。。。
91program 2013-03-22
  • 打赏
  • 举报
回复
引用 7 楼 xqhrs232 的回复:
JRTPLIB 库是做什么用的?第一次看到!
这个可以 google 到的 实时传输协议(Real-time Transport Protocol,PRT)是在 Internet 上处理多媒体数据流的一种网络协议,利用它能够在一对一(unicast,单播)或者一对多(multicast,多播)的网络环境中实现传流媒体数据的实时传输。RTP 通常使用 UDP 来进行多媒体数据的传输,但如果需要的话可以使用 TCP 或者 ATM 等其它协议。
woshi_ziyu 2013-03-22
  • 打赏
  • 举报
回复
也是头一次听说这个 没接触过
xqhrs232 2013-03-21
  • 打赏
  • 举报
回复
JRTPLIB 库是做什么用的?第一次看到!
91program 2013-03-21
  • 打赏
  • 举报
回复
在 CE 下用过 JRTPLIB 的说说啊,呵呵...
91program 2013-03-20
  • 打赏
  • 举报
回复
引用 4 楼 hopease 的回复:
LZ 使用的是 RTP 3.7.1 的版本吧,以前在 PC 下试过,没有出现 LZ 所描述的错误。
多谢回复! 偶的 PC 上运行也没有问题,但同样的代码(可能因为宏定义编译不同的代码吧)在 CE 下运行时出错。 正在查原因,但有点无从入手的感觉。
hopease 2013-03-20
  • 打赏
  • 举报
回复
LZ 使用的是 RTP 3.7.1 的版本吧,以前在 PC 下试过,没有出现 LZ 所描述的错误。
91program 2013-03-19
  • 打赏
  • 举报
回复
再发一个 Socket 初始化函数的代码:


int RTPUDPv4Transmitter::Create(size_t maximumpacketsize,const RTPTransmissionParams *transparams)
{
	const RTPUDPv4TransmissionParams *params,defaultparams;
	struct sockaddr_in addr;
	RTPSOCKLENTYPE size;
	int status;

	if (!init)
		return ERR_RTP_UDPV4TRANS_NOTINIT;
	
	MAINMUTEX_LOCK

	if (created)
	{
		MAINMUTEX_UNLOCK
		return ERR_RTP_UDPV4TRANS_ALREADYCREATED;
	}
	
	// Obtain transmission parameters
	
	if (transparams == 0)
		params = &defaultparams;
	else
	{
		if (transparams->GetTransmissionProtocol() != RTPTransmitter::IPv4UDPProto)
		{
			MAINMUTEX_UNLOCK
			return ERR_RTP_UDPV4TRANS_ILLEGALPARAMETERS;
		}
		params = (const RTPUDPv4TransmissionParams *)transparams;
	}

	// Check if portbase is even
	if (params->GetPortbase()%2 != 0)
	{
		MAINMUTEX_UNLOCK
		return ERR_RTP_UDPV4TRANS_PORTBASENOTEVEN;
	}

	// create sockets
	
	rtpsock = socket(PF_INET,SOCK_DGRAM,0);		// Leo IPPROTO_IP
	if (rtpsock == RTPSOCKERR)
	{
		MAINMUTEX_UNLOCK
		return ERR_RTP_UDPV4TRANS_CANTCREATESOCKET;
	}
	rtcpsock = socket(PF_INET,SOCK_DGRAM,0);
	if (rtcpsock == RTPSOCKERR)
	{
		RTPCLOSE(rtpsock);
		MAINMUTEX_UNLOCK
		return ERR_RTP_UDPV4TRANS_CANTCREATESOCKET;
	}

	// set socket buffer sizes
	
	size = params->GetRTPReceiveBuffer();
	if (setsockopt(rtpsock,SOL_SOCKET,SO_RCVBUF,(const char *)&size,sizeof(int)) != 0)
	{
		RTPCLOSE(rtpsock);
		RTPCLOSE(rtcpsock);
		MAINMUTEX_UNLOCK
		return ERR_RTP_UDPV4TRANS_CANTSETRTPRECEIVEBUF;
	}
	size = params->GetRTPSendBuffer();
	if (setsockopt(rtpsock,SOL_SOCKET,SO_SNDBUF,(const char *)&size,sizeof(int)) != 0)
	{
		RTPCLOSE(rtpsock);
		RTPCLOSE(rtcpsock);
		MAINMUTEX_UNLOCK
		return ERR_RTP_UDPV4TRANS_CANTSETRTPTRANSMITBUF;
	}
	size = params->GetRTCPReceiveBuffer();
	if (setsockopt(rtcpsock,SOL_SOCKET,SO_RCVBUF,(const char *)&size,sizeof(int)) != 0)
	{
		RTPCLOSE(rtpsock);
		RTPCLOSE(rtcpsock);
		MAINMUTEX_UNLOCK
		return ERR_RTP_UDPV4TRANS_CANTSETRTCPRECEIVEBUF;
	}
	size = params->GetRTCPSendBuffer();
	if (setsockopt(rtcpsock,SOL_SOCKET,SO_SNDBUF,(const char *)&size,sizeof(int)) != 0)
	{
		RTPCLOSE(rtpsock);
		RTPCLOSE(rtcpsock);
		MAINMUTEX_UNLOCK
		return ERR_RTP_UDPV4TRANS_CANTSETRTCPTRANSMITBUF;
	}
	
	// bind sockets

	bindIP = params->GetBindIP();
	mcastifaceIP = params->GetMulticastInterfaceIP();
	
	memset(&addr,0,sizeof(struct sockaddr_in));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(params->GetPortbase());
	addr.sin_addr.s_addr = htonl(bindIP);			// Leo htonl(INADDR_ANY);
	if (bind(rtpsock,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) != 0)
	{
		RTPCLOSE(rtpsock);
		RTPCLOSE(rtcpsock);
		MAINMUTEX_UNLOCK
		return ERR_RTP_UDPV4TRANS_CANTBINDRTPSOCKET;
	}
	memset(&addr,0,sizeof(struct sockaddr_in));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(params->GetPortbase()+1);
	addr.sin_addr.s_addr = htonl(bindIP);
	if (bind(rtcpsock,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) != 0)
	{
		RTPCLOSE(rtpsock);
		RTPCLOSE(rtcpsock);
		MAINMUTEX_UNLOCK
		return ERR_RTP_UDPV4TRANS_CANTBINDRTCPSOCKET;
	}

	// Try to obtain local IP addresses

	localIPs = params->GetLocalIPList();
	if (localIPs.empty()) // User did not provide list of local IP addresses, calculate them
	{
		int status;
		
		if ((status = CreateLocalIPList()) < 0)
		{
			RTPCLOSE(rtpsock);
			RTPCLOSE(rtcpsock);
			MAINMUTEX_UNLOCK
			return status;
		}
#ifdef RTPDEBUG
		std::cout << "Found these local IP addresses:" << std::endl;
		
		std::list<uint32_t>::const_iterator it;

		for (it = localIPs.begin() ; it != localIPs.end() ; it++)
		{
			RTPIPv4Address a(*it);

			std::cout << a.GetAddressString() << std::endl;
		}
#endif // RTPDEBUG
	}

#ifdef RTP_SUPPORT_IPV4MULTICAST
	if (SetMulticastTTL(params->GetMulticastTTL()))
		supportsmulticasting = true;
	else
		supportsmulticasting = false;
#else // no multicast support enabled
	supportsmulticasting = false;
#endif // RTP_SUPPORT_IPV4MULTICAST

	if ((status = CreateAbortDescriptors()) < 0)
	{
		RTPCLOSE(rtpsock);
		RTPCLOSE(rtcpsock);
		MAINMUTEX_UNLOCK
		return status;
	}
	
	if (maximumpacketsize > RTPUDPV4TRANS_MAXPACKSIZE)
	{
		RTPCLOSE(rtpsock);
		RTPCLOSE(rtcpsock);
		DestroyAbortDescriptors();
		MAINMUTEX_UNLOCK
		return ERR_RTP_UDPV4TRANS_SPECIFIEDSIZETOOBIG;
	}
	
	maxpacksize = maximumpacketsize;
	portbase = params->GetPortbase();
	multicastTTL = params->GetMulticastTTL();
	receivemode = RTPTransmitter::AcceptAll;

	localhostname = 0;
	localhostnamelength = 0;

	waitingfordata = false;
	created = true;
	MAINMUTEX_UNLOCK
	return 0;
}
91program 2013-03-19
  • 打赏
  • 举报
回复
我看了一下 sock 的值,是正确的。就是不知道,还有什么可能会引起引函数错误。 请大家帮忙看看
91program 2013-03-19
  • 打赏
  • 举报
回复
具体出错的 CPP 文件是:rtpudpv4transmitter.cpp 中的函数



int RTPUDPv4Transmitter::PollSocket(bool rtp)
{
RTPSOCKLENTYPE fromlen;
int recvlen;
char packetbuffer[RTPUDPV4TRANS_MAXPACKSIZE];
#if (defined(WIN32) || defined(_WIN32_WCE))
SOCKET sock;
unsigned long len;
#else
size_t len;
int sock;
#endif // WIN32
struct sockaddr_in srcaddr;

if (rtp)
sock = rtpsock;
else
sock = rtcpsock;

len = 0;
RTPIOCTL(sock,FIONREAD,&len); // 此句出错
if (len <= 0)
return 0;

while (len > 0)
{
RTPTime curtime = RTPTime::CurrentTime();
fromlen = sizeof(struct sockaddr_in);
recvlen = recvfrom(sock,packetbuffer,RTPUDPV4TRANS_MAXPACKSIZE,0,(struct sockaddr *)&srcaddr,&fromlen);
if (recvlen > 0)
{
bool acceptdata;

// got data, process it
if (receivemode == RTPTransmitter::AcceptAll)
acceptdata = true;
else
acceptdata = ShouldAcceptData(ntohl(srcaddr.sin_addr.s_addr),ntohs(srcaddr.sin_port));

if (acceptdata)
{
RTPRawPacket *pack;
RTPIPv4Address *addr;
uint8_t *datacopy;

addr = RTPNew(GetMemoryManager(),RTPMEM_TYPE_CLASS_RTPADDRESS) RTPIPv4Address(ntohl(srcaddr.sin_addr.s_addr),ntohs(srcaddr.sin_port));
if (addr == 0)
return ERR_RTP_OUTOFMEM;
datacopy = RTPNew(GetMemoryManager(),(rtp)?RTPMEM_TYPE_BUFFER_RECEIVEDRTPPACKET:RTPMEM_TYPE_BUFFER_RECEIVEDRTCPPACKET) uint8_t[recvlen];
if (datacopy == 0)
{
RTPDelete(addr,GetMemoryManager());
return ERR_RTP_OUTOFMEM;
}
memcpy(datacopy,packetbuffer,recvlen);

pack = RTPNew(GetMemoryManager(),RTPMEM_TYPE_CLASS_RTPRAWPACKET) RTPRawPacket(datacopy,recvlen,addr,curtime,rtp,GetMemoryManager());
if (pack == 0)
{
RTPDelete(addr,GetMemoryManager());
RTPDeleteByteArray(datacopy,GetMemoryManager());
return ERR_RTP_OUTOFMEM;
}
rawpacketlist.push_back(pack);
}
}
len = 0;
RTPIOCTL(sock,FIONREAD,&len);
}
return 0;
}

19,519

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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