How to handle write errors in non blocking sockets
Hi,
I'm using sockets registered with a Selector for read operations. I've seen code examples that put the SocketChannel in non blocking mode before registering it with the selector, and in fact not doing so would cause an IllegalBlockingModeException to be thrown.
My problem is that I can't handle write errors. The call to write() returns inmediately without throwing any exception. Even worse, when the network timeout expires the selector wakes up and I get an exception on read(). So I can't tell the difference between a real read error and a write error.
What can I do? Is there a magic method I haven't heard about?
Thanks
ejp wrote:
OK, so what happens is this: you write from your ByteBuffer; if there is room in the socket send buffer, the data is transferred and the transfer count is returned. (If there isn''t, the write returns zero and nothing has happened.) Your application code then continues. Meanwhile TCP is trying to send the data in the send buffer and get an ACK from the peer. If the peer is down as per your test, eventually those write attempts will time out. You will then get a connection reset exception on the next read or write.
Even worse, when the network timeout expires the selector wakes upCorrect, to tell you there is an error condition pending. This is good, not bad.You're right. This way my program can know that something happened.
But I still don't understand what the difference between a failed write() and a failed read() is. I mean, the error condition may appear during a send attempt, or it may appear after sending. In both cases I get an error when trying to read. How can my program know if data have been received by the other end?
Do I have to implement ACK messages in the application level protocol??? It'd be nice if TCP could do this for me...
Similar Messages
-
Detecting When a Non-Blocking Socket Is Closed by the Remote Host
Hi,
Using NIO non blocked sockets how do I detect when a Non-Blocking Socket Is Closed by the Remote Host?
What I have read is:
The only way to detect that the remote host has closed the connection is to attempt to read or write from the connection. If the remote host properly closed the connection, read() will return -1. If the connection was not terminated normally, read() and write() will throw an exception.
I have written a server test program using NIO and an applet connecting to the server program via sockets.
When I after a successful connection shuts down the browser following happens: The code below comes in an endless loop though mySelector.select returns 0 every time. (The selector is registered for OP_READ). size = 1.
while (true) {
int n = mySelector.select();
int size = mySelector.keys().size();
if (n == 0) continue;
Is this an expected result?
How do I get to know what client has lost connection?
My environment:
W2000
java 1.4.1 build 1.4.1_01-b01
Browser used: IE 5.0
Many thanks for your help on this matter!
Regards Magnus Wistr�mWhat you're doing looks OK to me.
I wonder whether your thread is being interrupted by Thread.intterupt() somewhere. Try putting a Thread.interrupted() before the select call.
Sylvia. -
How to handle the #error in ssrs expression
hi
Please any one help me to resolve this #error ,
I have a calculated filed in that expression i given a if condition like below
data of column is coming like this 0 , 0.0
=IIF(Fields!Column1.Value=0,0,((Fields!Column2.Value - Fields!Column1.Value)/( Fields!Column1.Value)))
how to handle the #error
Please let me know any oneHi deepuk23,
According to your description, when you use the IIF() function in the report you got some error,right?
The issue can be caused by the column1 and column2 have different datatype, I assumed that one is integer and another is float, when the Column1 is 0 or null, because IIF() function always evaluates both the true part and the false part, even
though it returns only one of them, it will throw out the error.
To resolve the issue, you should use a nested IIF() function to avoid the zero-divisor in any rate like below:
=IIF(Fields!Column1.Value=0,0,((Fields!Column2.Value - Fields!Column1.Value)/(IIF(Fields!Column1.Value=0,1,Fields!Column1.Value))))
For more information, please refer to this article:
FAQ: Why does the “Attempted to divide by zero” error still happen?
If you still have any problem, please feel free to ask.
Regards,
Vicky Liu
Vicky Liu
TechNet Community Support -
How to handle the errors using RSRV tcode
Hi all,
Could any one give tell me how to handle the errors,(if possible give me some example errors)and correct the errors using RSRV tcode.
Thanks & Regards,
Aswini.Hello Aswini,
For further details on RSRV go through the link:
http://help.sap.com/saphelp_nw04/helpdata/en/92/1d733b73a8f706e10000000a11402f/frameset.htm
Hope it helps
Cheers
SRS -
How to handle transport errors????
Hi Gurus.
How to handle transport errors and create a workflow email to the owner of the transport from solution manager??Solution manager does provide automatic e-mail notification when status changes or error occures.To answer your question when ever transport fails ..you can configure such way that a support message can create automatically and notify support team / respective person.
If you are not using any t-code do you have any thoughts where you can create transport request???? and are you using solution manager only for maintanence project or for implimentation project also????
Hope this helps you....
Praveen -
Writing Java Non-Blocking Socket Server for Winsock Client
Hi.
Im a newbie to Sockets. I need to write a Non-Blocking Socket server (using java.nio) that accepts connection and reads the data sent by WinSock clients, and write them to another winsock client. Its quite intriguing. How do I do that? Is it possible?
Thanks in advance
ArunWell, in traditional 4.2 BSD sockets, you'd fill up a set of filedescriptors of connections (an array of bits usually), and push that in the read parameter of a call to 'select'. Select then blocks until at least one of the file descriptors become available for reading, or writing if you also made an fd_set full of file descriptors (but you can usually write freely to a socket, so there is not much use for that). Then you start finding out which of these file descriptors have actually become available for reading, and you pass those to a bunch of worker-threads. The advantage is that your set of worker-threads can be quite small, while your number of connections can still be quite large (unless, of course, everyone of your clients start talking all at once, but that is no different from the one-socket-one-thread-model that java.net.* forces upon you).
In java, the 'select' call is replaced by a call to java.nio.channels.Selector.select(); and then the fishing out of the selected stuff comes from java.nio.channels.Selector.selectedKeys().
To add a thingy to a selector, use (for example) java.nio.channel.ServerSocketChannel.register(Selector, ops, att);
whereby the ops parameter is the kind of action you'd like to select this channel for; SelectionKey.OP_READ etc..
The workerthread bit is also easy to write, but I leave that to you as an exercise. -
Easy way to non-blocked sockets
Use JSSE and NIO for a quick way to implement non-blocking communications
October 22, 2003
Although SSL blocking operations -- in which the socket is blocked from access while data is being read from or written to -- provide better I/O-error notification than the non-blocking counterpart, non-blocking operations allow the calling thread to continue. In this article, the author will cover both the client and server side as he describes how to create non-blocking secure connections using the Java Secure Socket Extensions (JSSE) and the Java NIO (new I/O) library, and he will explain the traditional approach to creating a non-blocking socket, as well as an alternative (and necessary) method if you want to use JSSE with NIO.
http://www-106.ibm.com/developerworks/java/library/j-sslnb.html?ca=dgr-jw03j-sslnbMORE IBM SPAM Previous discussion
I find it interesting spam, but thats a matter of taste. If the OP was truly interested in "trying to get new information out there" he would answer the mulitple questions about NIO and especially NIO mixed with traditional Sockets and NIO vs Secure Sockets. These are all on ALT, NIO is of no interest to New to Java folk.
Given their budget I think IBM could do a better job of publishing their research. -
Broken Pipe with Non-blocking Socket
Hello,
I write a Unix Agent who connect on a Windows Server with socket...
Working well on Linux but on Solaris my problem is:
-When my agent is running before server at connection all seems OK: Connect, Select and Getsockopt but when I try to send data I have always EPIPE Signal but I can receive datas from server !
- When my agent is strarting after the server all it's Ok
I don't unserstand this appears on Solaris SPARC 8 and Solaris 9 Intel ...
Please Help is there something special with non-blocking sockets on Solaris ?
ThanksCan't help you much but what I would recommend is that you
insure that your pipes are opened for both read/write, even
though you are only going to read or write from it. This insures
that the pipe does not close down when you hit EOF. -
Hi All,
Anybody have some idea about how to implement non blocking sockets using two threads/Can u help me with some sites where i can get more information in this topic.
Regards
Priyahi,
you could have a look at the nonblocking io (nio) api's present in jdk1.4, that should do the trick. this link ought to get u started i suppose..
http://developer.java.sun.com/developer/technicalArticles/releases/nio/
hope this helps.
cheerz
ynkrish -
Read Timeout on non-blocking sockets
Hi,
I was wondering if there is a way to specify a read timeout (like setSoTimeout for synchronous sockets) when using a non-blocking socket.
I'd like to have the select() method return is a sockets timeout expires, puting in the selected key set the timedout socket and have it's read operation return -1, something like what happens when a socket is closed by the other side.
The thing is I need this to be a timeout specific to each socket, thus the select(millis) isn't apropriate.
Anyone knows of something like this?
Thanks....Yeah, select() is the only thing built in for that, and you have to do the bookkeeping yourself. You would start something like forming the disjunction of the ready keys and the registered keys after each select, to get the unready keys, and then looking at their history to see how long they have been unready via a Map{key,Long(time)).
-
Troubles with timeout using java.nio.channels and non-blocking sockets
Hello.
I have a server application that employs java.nio.channels with non-blocking sockets.
The server waits for connections. The client should connect and be first in sending data.
Timeouts are significant! If client exceeds the allowed time to send data, the server should break the connection.
The huge trouble I've discovered that I cannot control the timeout when client connects but remains silent.
My code looks as follows:
<pre>
Selector oSel;
SocketChannel oSockChan;
Socket oSock;
SelectionKey oSelKey;
Iterator<SelectionKey> oItSelKeys;
int iCurrState, iMask, iCount;
iCurrState = INT_SERVER_WORKING;
iMask = SelectionKey.OP_ACCEPT | SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE;
while ( iCurrState == INT_SERVER_WORKING )
try
*// retrieving next action*
iCount = oSel.select();
if ( iCount > 0 )
oItSelKeys = oSel.selectedKeys().iterator();
while ( oItSelKeys.hasNext() )
oSelKey = oItSelKeys.next();
oItSelKeys.remove();
if ( oSelKey.isValid() )
switch ( oSelKey.readyOps() & iMask ) {
case SelectionKey.OP_ACCEPT :
oSockChan = oSSockChan.accept();
oSockChan.configureBlocking(false);
oSock = oSockChan.socket();
oSock.setKeepAlive(true);
oSockChan.register(oSel,SelectionKey.OP_READ,new MyPacket(oSock.getInetAddress(),oSock.getPort()));
break;
case SelectionKey.OP_READ :
oSelKey.interestOps(0);
((MyPacket) oSelKey.attachment()).inRequest(); *// preparing request*
this.getReader().add(oSelKey); *// sending key to reading thread*
break;
case SelectionKey.OP_WRITE :
oSelKey.interestOps(0);
((MyRequest) oSelKey.attachment()).inResponse(); *// preparing response*
this.getWriter().add(oSelKey); *// sending key to writing thread*
break;
case SelectionKey.OP_CONNECT :
default :
*// nothing to do*
catch ( IOException oExcept )
*// do some actions*
</pre>
Timeouts are easily controlled by reading and writing threads (see OP_READ and OP_WRITE ).
But when a client just connects without consequent data send, the state of this connection remains as OP_ACCEPT. The connection remains open for arbitrarily large time and I cannot control it!
Please help with idea how can I terminate such connections!How can I process the keys that weren't selected at the bottom of the loop? Should I use the method keys() ?Yes. Form a new set from keys() and removeAll(selectedKeys()). Do that before you process selectedKeys().
And the second moment: as I understood a single key may contain several operations simultaneously? Thus I should use several if's (but not if/else 'cause it's the equivalent of switch ... case ).If there is anything unclear about 'your switch statement is invalid. You need an if/else chain' I fail to see what it is. Try reading it again. And if several ifs were really the equivalent of "switch ... case", there wouldn't be a problem in the first place. They're not, and there is. -
Non Blocking Socket ans Session management
All samples of Non Blocking socket use SelectionKey.attach( Object ob) to attach a partial message if the received data is incomplete. So far so good.
Are we supposed to use the same approach for session management ( Keeping info on Username, password, timeout values, etc.)
ThanksI disagree with your first statement. The attachment is normally a session object that contains user information, session state, and the ByteBuffer.
-
UTL_TCP (blocking or non-blocking sockets mode)
Hi for All,
Please, someone knows if the UTL_TCP using blocking or non-blocking sockets mode? I did a search but can not find this information.
Regards,Blocking only occurs when you attempt to read from the socket and there's no data to read. (in which case, the time out setting applies if specified)
This is however not that robust in my experience. UTL_TCP provides a peek method (returns byte size of socket buffer) that tells you whether or not there is data for that socket. This enables you to verify that you read on that socket will not be a blocking call.
I prefer using this method, as dealing with a timeout approach results in run-time behaviour issues (either a call waiting too long, or a call timing out too quickly). -
How to handle the errors in transformations
Hi
I am using SOA, JDev 10.1.3.3.
How to handle the exceptions in transformations.
If any thing goes wrong in transformation then how to handle that situation.
I am not getting any kind of instances like errored out..
Please help me out
Regards
PavankumarI think your issue is that your process is going into manual recovery.
In the console click on the tab BPEL processes. There is a link on the left for manual recovery. Do you see your processes there?
What happens if you put your transformation into a scope. The in that scope you have a catch All. In this catch All routine just do a terminate. This will error your process but you should see it appear in the console.
cheers
James -
How to handle system errors in XI using BPM? please help!
Hi Experts,
I have a requirement where I have to handle system errors. For example when I am making RFC call using RFC adapter if the remote destination is down then I have create a understandable error message and store it in another SAP table.
How to handle it? I am using BPM. I can see that there is "Exceptions" in the send step. How to use this?
Thanks
GopalHi Gopalkrishna,
In this case whenever you get Mapping Exception , you can raise an Exception with the help of BPM and you can send the status to the RFC. But with the help of BPM.
For a Simple case refer:
http://help.sap.com/saphelp_nw2004s/helpdata/en/33/4a773f12f14a18e10000000a114084/frameset.htm
If you want you can do it without a BPM
and throw an exception in case any of the values is missing:
have a look at this weblog on how to throw exceptions
in a nice way:
/people/alessandro.guarneri/blog/2006/01/26/throwing-smart-exceptions-in-xi-graphical-mapping
Also just go through <a href="/people/sap.user72/blog/2005/02/23/raising-exceptions-in-sap-xi-mapping Exceptions in SAP XI Mapping</a> and see if it helps you solve the problem.
Also go through these links:
http://help.sap.com/saphelp_nw04/helpdata/en/dc/6b7f2243d711d1893e0000e8323c4f/content.htm
http://help.sap.com/saphelp_nw04/helpdata/en/68/253239bd1fa74ee10000000a114084/content.htm
http://help.sap.com/saphelp_nw04/helpdata/en/cf/f2bbc8142c11d3b93a0000e8353423/frameset.htm
http://help.sap.com/saphelp_nw04/helpdata/en/5d/2166e6a91d11d188de0000e8216438/content.htm
http://help.sap.com/saphelp_nw04/helpdata/en/05/bb223905b61b0ae10000000a11402f/content.htm
Please do let know if it helped.
Regards,
Abhy
Maybe you are looking for
-
FILE to multiple BAPI/RFC calls
Hi, I have one input source (CSV with about 100 rows) and I wish to call a custom rfc for each row in my spreadsheet. (The custom RFC has a single flat import structure as opposed to a table or anything complex). I am struggling to do this in XI. I a
-
Kernel missing from default install
Hi, I just installed arch linux in a dual boot configuration with windows xp. During the installation I selected only the base packages and installed the default kernel, the IDE/SCSI one. The kernel installed fine and I installed grub to /dev/sda as
-
After capacity leveling dependent requirement s to be adjusted
hi iam planning a fert product on 30 th agust for 100nos created md61 -pir for 100 nos done mrp run at mdo2 and got scheduled dates for 100nos which has gone beyond the requirement date as i was chhosed leed time scheduling and made dependent reqire
-
Lightroom CC HDR - changes resolution in final HDR image
OK running into this odd problem on using LR CC this morning. Yesterday performed two or three HDR combos and everything worked well. This morning, combining 7 NEF files from my D810 produces a final HDR image in low resolution - about 1000 pixels
-
I've seen this before, apologies, feel like it's a dumb question, but I'm only seeing three of the list types when I should b seeing 15 or so.... Thanks, Scott