PDA

View Full Version : [C++] Win Mobile 5 e jrtplib


monelli
06-10-2009, 10:13
Allora... Lo stesso codice su win32 gira bene su winCe si blocca e non capisco il perchè...
Mi dà questo errore
Il thread 0x96db90aa è terminato con il codice 0 (0x0).
Scarica modulo: MFC90UD.dll
Scarica modulo: wininet.dll
Scarica modulo: shlwapi.dll
Scarica modulo: msvcr90d.dll
Scarica modulo: compime.dll
Scarica modulo: nspm.dll
Scarica modulo: dtpt_nsp.dll
Scarica modulo: oleaut32.dll
Scarica modulo: commctrl.dll
Scarica modulo: aygshell.dll
Scarica modulo: wspm.dll
Scarica modulo: dtpt_lsp.dll
Scarica modulo: AutoBind_lsp.dll
Scarica modulo: ssllsp.dll
Scarica modulo: ws2.dll
Scarica modulo: ossvcs.dll
Scarica modulo: ole32.dll
Il programma '[0x77152C0E] Example1.exe' è terminato con il codice -1073741571 (0xc00000fd).

Ma la mia applicazione non usa i thread...

Ed ecco dove si presenta l'errore, all'interno della jrtplib ma non capisco cosa c'è di sbagliato:

int RTPUDPv4Transmitter::Poll()
{
if (!init)
return ERR_RTP_UDPV4TRANS_NOTINIT;

int status;

MAINMUTEX_LOCK
if (!created)
{
MAINMUTEX_UNLOCK
return ERR_RTP_UDPV4TRANS_NOTCREATED;
}
status = PollSocket(true); // poll RTP socket
if (status >= 0)
status = PollSocket(false); // poll RTCP socket
MAINMUTEX_UNLOCK
return status;
}

Tutto funzione provando col debugger passo passo (F11) finchè non arrivo a
status = PollSocket(true);
Premo nuovamente F11 e entro nella funzione...

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;
}

Il debugger si ferma nella seconda riga dove c'è la parentesi graffa aperta...
Premo nuovamente F11 e il programma termina stampando l'errore che ho scritto in precedenza.

Lo stesso codice su win32 funziona bene.

Non sò dove sbattere la testa cosa può essere???
Provato anche su win mobile 6 e mi dà lo stesso errore...
Help grazie

monelli
06-10-2009, 10:24
Ho trovato la soluzione:

Nelle impostazioni di visual studio sotto
Linker---->Sistema

Ci sono due voci:

dimensione stack riservata 65536
dimensione stack commit 4096

Cosa sono questi valori e soprattutto da cosa dipendono? Aggiungendo uno 0 a entrambi il programma funziona... Però Non mi è chiaro...