iSocket.Read(iBuffer,status) can't reset iBuffer
| Tue, 2005-02-15 23:42 | |
|
Hi I have a problem understanding the behaviour of iSocket.Read(iBuffer,status) and why iBuffer is always appending the new received data instead of show each message separately. Here is my code snippet (inspired from http://www.symbian.com/developer/techlib/papers/Sockets/sockets.html) for the RunL and the getBufferContent methods : Code: TBuf<256> iBuffer; When calling GetBufferContent i receive (for n messages sent ) : Message1 Message2 and so on, as if everything was appended ( It would be kinda ok, but the fact that i'm explicitely doing a iBuffer.Delete ( I also tried with Zero() ) should erase the whole content of the iBuffer. Or have i missed something ?void MySocketEngine::RunL(void) { //Means that the Accept was ok; if (iStatus==KErrNone) { // I would like to clear the content of iBuffer, so that // new data can be received. // iBuffer.Delete(0,iBuffer.Length()); TRequestStatus stat; iSocket.Read(iBuffer,stat); } } HBufC* MySocketEngine::GetBufferContent() { HBufC* myStr = HBufC::NewL(256) myStr->Des().Copy(iBuffer); return myStr } Thanx a lot for your help ! MatD:-) MatD |
|






Forum posts: 69
I user iBuffer.Zero() and it works fine for me.
The only difference is that I don;t use it directly
in the iSocket.Read() method. This is how I do it.
iBuffer.Zero();
IssueRead(iBuffer);
and then the IssueRead method is implemented as follows.
{
// Initiate a new read from socket into iBuffer
__ASSERT_ALWAYS(!IsActive(), User::Panic(KPanicSocketsEngineRead, ESocketsBadState));
iSocket.Recv(rcv_buffer, 0, iStatus);
SetActive();
}
Let me know if this helps.
Forum posts: 93
Thx a lot for your help. It works fine and i also put the iBuffer.Zero out of the code, because it was not necessary for me. I just wanted to mention something very very very curious.
I was testing this code snippet for receiving a message on socket, with a Java SocketClient. And I found out the following tricky problem:
On the SocketServer Side ( Symbian ) my Buffer msg has a size of five (TBuf<5> msg).
First I've used this Java code snippet to send a message:
String text = "Hello World";
out.println(text);
out.println("\n\r");
The received message on my Symbian Server was :
1 -
2 - Worl
3 - d
First line (1) : nothing ( the message was always cut by the size of my Symbian side buffer ) why
Second line (2) : (blank space)World
Third line : d
My initial message always began with empty characters. Increasing the size of the buffer hasn't helped
I've then changed my Java SockClient into :
out = new BufferedOutputStream(socket.getOutputStream());
String text = "Hello World"
out.write(text.getBytes());
out.flush();
And now it works
Can someone explain me, what went wrong ? Why had I to change my PrintWriter into a BufferedOutputstream ? I have the feeling that the Printwriter is sending more chars than needed and doesn't send it correctyl ( or isn't correctly received by the C++ side).
MatD
MatD
Forum posts: 69
aprt from that I think its best NOT to use \r and \n
although they are written correctly at the java side,
they are not interpreted correctly at the symbian side.
I too had this problem earlier, and I had to remove
all the \r\n in the data that is being exchanged.
Best/Safest option is to convert everything in to a byte array
and send it out and flush the stream.
-sourabh