Hi! I'm using CW and NetLib to develop application that sends/receives files
to and from a java server.
I've come across a huge question that I've been working on to solve it for
months. That is:
1. When receiving a file from the server, it seems impossible to receive a
large file completly. I use for loop to re-receive the buffer that holds the
file on the server.
But the connection seems unstable. For example, I want to receive a file
sized 73681bytes. Most of the time, when I receive 7888 bytes, then it get
stuck. And some times I can receive the file up to 46000 bytes. Why is
that!? It had been bothering me for a long time..... Here is a section of my
code for receiving files.
Boolean Receive_File()
{
MemPtr HTTPContent = MemPtrNew(4096);
int flag = 1;
int loop = 1;
Boolean reconnect;
Err Receive_File_ErrorMsg;
UInt32 filesize = NULL;
while(flag==1)
{
//*****************************************
// Check and print File Size
//*****************************************
VFSFileSize(fileRefP, &filesize);
char* size;
char f[3];
int line2=0;
size = StrIToA(f, filesize);
WinDrawChars("File Size:", strlen("File Size:"),40,30);
WinDrawChars(size, strlen(size),50,40+line2);
line2+=10;
if((int)filesize == 73681)
{
flag =0;
reconnect = false;
}
else
{
connect = NetLibReceive(libRefNum, sockfd, HTTPContent,4096,
0,NULL, 0, timeout, &Receive_File_ErrorMsg);
if(connect == -1)
{
char* ErrorMessage;
ErrorMessage = NetLibReceive_ErrorMsg(Receive_File_ErrorMsg);
WinDrawChars("ERROR in NetLibReceive", strlen("ERROR in
NetLibReceive"),50,130);
WinDrawChars(ErrorMessage, strlen(ErrorMessage),0,140);
MemSet(HTTPContent, 4096, 0);
flag=1;
//*****************************************
// Check how many times
//*****************************************
StrIToA(LOOP, loop);
loop++;
WinDrawChars("loop: ", 5,70,150);
WinDrawChars(LOOP, strlen(LOOP),100,150);
if(loop>5)
{
flag = 0;
reconnect = true;
}
}//if(connect = -1)
else if(connect == 0)
{
WinDrawChars("Connection Closed!", strlen("Connection
Closed!"),0,140);
flag = 0;
reconnect = false;
}
else // if there're incomming bytes
{
file_err = VFSFileWrite(fileRefP,connect,HTTPContent, NULL );
MemSet(HTTPContent, 2048, 0);
reconnect = false;
}
}//end of else
}//end of while loop
VFSFileClose(fileRefP);
MemPtrFree(HTTPContent);
return reconnect;
}
2. The second problem that I come across is that when sending a file to the
server, it works fine while the file size is 30k. But when sending a JPEG
file that is 86.4k, the server did receive the file, but the actual byte
that received isn't correct. It's less than 86.4K and the tail of the file
twisted. Can anyone please tell me what cause this happen...
Here is a section of my code to send files.
int line=0,flag=1, SEND_BUFFER_SIZE = 2048,sendByte = 0;
UInt32 numBytesRead;
Char byte[3];
MemPtr bufP_attach = MemPtrNew(SEND_BUFFER_SIZE);
while(flag==1)
{
VFSFileRead (fileRefP_attach, SEND_BUFFER_SIZE, bufP_attach,
&numBytesRead);
if(numBytesRead == 0)
{
flag = 0;
break;
}
connect = NetLibSend(libRefNum, sockfd, bufP_attach,
numBytesRead,0,NULL,0,timeout*2,&err );
if(connect == -1)
{
flag = 0;
WinDrawChars("ERROR in NetLibSend", strlen("ERROR in
NetLibSend"),10,90);
NetLibSocketClose(libRefNum, sockfd, timeout, &err);
NetLibClose(libRefNum, 0);
}
MemSet(bufP_attach, SEND_BUFFER_SIZE, 0);
StrIToA(byte, connect);
WinDrawChars(byte, strlen(byte),100,line+=8);
}
WinDrawChars("File has been sent!",strlen("File has been sent!"),10,90);
VFSFileClose(fileRefP_attach);
free(bufP_attach);
Angela Chang
==========================================================
超值好禮自己賺 !!
http://edm-prg.epaper.com.tw/click.php?ad_code=29350
==========================================================
PChome交友~~幸福天天有 \*^o^*//
http://love.pchome.com.tw/
==========================================================
--
For information on using the Palm Developer Forums, or to unsubscribe, please see
http://www.palmos.com/dev/support/forums/