|
Can I assume that FD_Set@ is a pointer that points to FDes? And that there isn't any code that could change that? I'd also recommend doing an FDZero each time through the loop, and then setting each descriptor explicitly to make sure they're all set correctly. If you're still having trouble after that, try (for debugging only) hex dumping the contents of your FDes data somewhere that you can manually check that the correct descriptors are set before & after calling select, since that seems to be the likely source of a problem. As an aside, I generally find it better to rely on the values returned from FDIsSet rather than the return value from select(), other than for detecting actual errors while select() is running, that is. On Fri, 3 May 2002, Jim W wrote: > Sorry, I've been away from the list for awhile and forgot we don't have > attachments anymore. Code is below.... > > 0154.00 * Obtain a listening socket descriptor > 0155.00 C Eval SD = Socket(AF_INET: >SOCK_STREAM: 0) > 0156.00 C LogLvl IfEQ LogAll > 0157.00 C Eval EventID = 'ServerSocket' > 0158.00 C CallP EventLog (EventID) > 0159.00 C EndIF > 0160.00 > 0161.00 * If Socket failed - End the server program > 0162.00 C If SD < 0 > 0163.00 C LogLvl IfNE LogNone > 0164.00 C Eval EventID = 'Socket Failed' > 0165.00 C CallP EventLog (EventID) > 0166.00 C EndIF > 0167.00 C Eval *InLR = *On > 0168.00 C Return > 0169.00 C EndIf > 0170.00 > 0171.00 * Allow the socket description to be reusable > 0172.00 C Eval RC = SetSockOpt(SD: SOL_SOCKET > 0173.00 C : SO_REUSEADDR > 0174.00 C : %Addr(OptVal) > 0175.00 C : %Size(OptVal)) > 0176.00 C LogLvl IfEQ LogAll > 0177.00 C Eval EventID = 'SvrSetSckOpt' > 0178.00 C CallP EventLog (EventID) > 0179.00 C EndIf > 0180.00 > 0181.00 * If SetSockOpt failed - End the server program > 0182.00 C If RC < 0 > 0183.00 C LogLvl IfNE LogNone > 0184.00 C Eval EventID = 'SetSockOpt Failed' > 0185.00 C CallP EventLog (EventID) > 0186.00 C EndIF > 0187.00 C Eval *InLR = *On > 0188.00 C Return > 0189.00 C EndIf > 0190.00 > 0191.00 > 0192.00 * Bind the socket to a local address > 0193.00 C Eval SocketAddr = *LOVAL > 0194.00 C Eval SinFamily = AF_INET > 0195.00 C Eval SinPort = PortNumber > 0196.00 C Eval SinAddr = INADDR_ANY > 0197.00 C Eval RC = Bind (SD: %ADDR(SocketAddr) > 0198.00 C : %SIZE(SocketAddr)) > 0199.00 C LogLvl IfEQ LogAll > 0200.00 C Eval EventId ='ServerBind' > 0201.00 C CallP EventLog(EventID) > 0202.00 C EndIf > 0203.00 > 0204.00 * If Bind failed - End the server program > 0205.00 C If RC < 0 > 0206.00 C LogLvl IfNE LogNone > 0207.00 C Eval EventID = 'ServerBind Failed' > 0208.00 C CallP EventLog (EventID) > 0209.00 C EndIF > 0210.00 C Eval *InLR = *On > 0211.00 C Return > 0212.00 C EndIf > 0213.00 > 0214.00 * Listen to # of clients passed in MaxConnect > 0215.00 C Eval RC = listen (SD : MaxConnect) > 0216.00 C LogLvl IfEQ LogAll > 0217.00 C Eval EventID = 'ServerListen' > 0218.00 C CallP EventLog (EventID) > 0219.00 C EndIf > 0220.00 > 0221.00 * If Listen failed - End the server program > 0222.00 C If RC < 0 > 0223.00 C LogLvl IfNE LogNone > 0224.00 C Eval EventID = 'ServerListen Failed' > 0225.00 C CallP EventLog (EventID) > 0226.00 C EndIF > 0227.00 C Eval *InLR = *On > 0228.00 C Return > 0229.00 C EndIf > 0230.00 > 0231.00 * Clear readset array > 0232.00 C CallP FDZero(FDes) > 0233.00 C Eval SckFlags '0' > 0234.00 > 0235.00 * Set on the listening socket in readset and flag array > 0236.00 C CallP FDSet(SD: FDes) > 0237.00 C Eval SckFlags(SD + 1) = '1' > 0238.00 C Eval CurMax = SD > 0239.00 > 0240.00 * - - - - - - - - - - > 0241.00 * Processing loop > 0242.00 > 0243.00 C DoW 0 = 0 > 0244.00 > 0245.00 * .Restore readset using the flag array > 0246.00 * Flag '1' sets on, flag '0' sets off > 0247.00 C 0 Do CurMax J > 0248.00 C If SckFlags(J + 1) = '1' > 0249.00 C CallP FDSet(J: FDes) > 0250.00 C Else > 0251.00 C CallP FDClr(J: FDes) > 0252.00 C EndIf > 0253.00 C EndDo > 0254.00 > 0255.00 * .Select the sockets that connect or send data > 0256.00 * (deselect other sockets) > 0257.00 C Eval RC = Select(CurMax + 1 > 0258.00 C : FD_Set@: *NULL: *NULL > 0259.00 C : %Addr(WaitTime) ) > 0260.00 C LogLvl IfEQ LogAll > 0261.00 C Eval EventID = 'ServerSelect' > 0262.00 C CallP EventLog (EventID) > 0263.00 C EndIf > 0264.00 > 0265.00 * .If Select timed out - Restore readset and reenter loop > 0266.00 * (there is no incoming request waiting) > 0267.00 C If RC = 0 > 0268.00 C Iter > 0269.00 C EndIf > 0270.00 > 0271.00 * .If Select was unsuccessful - End the server program > 0272.00 * (a programming error) > 0273.00 C If RC < 0 > 0274.00 C CallP SckClose(SD) > 0275.00 C LogLvl IfNE LogNone > 0276.00 C Eval EventID = 'ServerSelect Failed' > 0277.00 C CallP EventLog (EventID) > 0278.00 C EndIF > 0279.00 C Eval *InLR = *On > 0280.00 C Return > 0281.00 C EndIf > 0282.00 > 0283.00 * .Process all incoming requests if Select is successful > 0284.00 C If RC > 0 > 0285.00 > 0286.00 * ..Inspection loop. Inspect all description bits in readset > 0287.00 * up to the current maximum and process those which are set on > 0288.00 C 0 Do CurMax I > 0289.00 > 0290.00 * ...If a bit is set on - Process the incoming request > 0291.00 C If FDIsSet(I: FDes) > 0 > 0292.00 > 0293.00 * ....If bit represents a listening socket - Accept a Connect > 0294.00 C If I = SD > 0295.00 > 0296.00 * .....Try to accept the first client in queue > 0297.00 * and create a new client's socket - SD2 > 0298.00 C Eval SD2 = Accept(SD: SockAddr: AddrLen) > 0299.00 C LogLvl IfEQ LogAll > 0300.00 C Eval EventID = 'ServerAccept' > 0301.00 C CallP EventLog (EventID) > 0302.00 C EndIf > 0303.00 > 0304.00 * .....Accept OK - Add the socket to readset > 0305.00 C If SD2 >= 0 > 0306.00 C CallP FDSet (SD2: FDes) > 0307.00 C Eval SckFlags(SD2 + 1) = '1' > 0308.00 > 0309.00 * .....Set a new current maximum of used sockets > 0310.00 C If SD2 > CurMax > 0311.00 C Eval CurMax = SD2 > 0312.00 C EndIf > 0313.00 > 0314.00 * ....End of Accept > 0315.00 C EndIf > 0316.00 > 0317.00 * ....Else (not a listening socket)-Receive and Process data > 0318.00 C Else > 0318.01 C Eval SocketData = *Blanks > 0319.00 > 0320.00 * ....Receive first 8 bytes of header length > 0321.00 C Eval RC = Recv(I: SocketData@ > 0322.00 C : 8: 0) > 0323.00 * If no data received, then reset RC > 0324.00 C Eval SockDtaLen = %Len(%Trim(SocketData)) > 0325.00 C If SockDtaLen = 0 > 0326.00 C Eval RC = 0 > 0326.01 C Else > 0326.02 * ....Use header length to receive request message > 0326.03 C Eval MsgLen = SocketData > 0326.04 > 0326.05 * Test for End of Server job > 0326.06 C If MsgLen = 'ENDSERVE' > 0326.08 C CallP SckClose(SD) > 0326.09 C Eval *INLR = *ON > 0326.10 C Return > 0326.11 C EndIf > 0326.12 > 0326.13 * ....Convert socket data from ASCII to EBCDIC > 0326.15 C CallP Translate(8: MsgLen: 'EBCDIC') > 0326.17 > 0326.18 C Move MsgLen MsgLenVar > 0326.19 * ....Receive from current socket up to header length > 0326.20 C Eval RC = Recv(I: SocketData@ > 0326.21 C : MsgLenVar: 0) > 0326.22 > 0326.23 C LogLvl IfEQ LogAll > 0326.24 C Eval EventID = 'ServerRecv' > 0326.25 C CallP EventLog (EventID) > 0326.26 C EndIf > 0326.27 > 0326.28 * .....If Recv failed - End the server program > 0326.29 C If RC < 0 > 0326.30 C**** Eval *InLR = *On > 0326.31 C**** Return > 0326.32 C LogLvl IfNE LogNone > 0326.33 C Eval EventID = 'Recv Ended' > 0326.34 C CallP EventLog (EventID) > 0326.35 C EndIf > 0326.36 C Leave > 0326.37 C EndIf > 0326.38 > 0326.39 C Eval SockDtaLen = %Len(%Trim(SocketData)) > 0326.40 * If no data received, then reset RC > 0326.41 C If SockDtaLen = 0 > 0326.42 C Eval RC = 0 > 0326.43 C Eval MsgLenVar = 0 > 0326.44 C Else > 0326.46 * If header length equal data length received > 0326.47 C If SockDtaLen = MsgLenVar > 0326.48 * .....Recv OK - Process data > 0326.49 C ExSr ProcData > 0326.50 C Else > 0326.51 * .....Recv Not OK - Create and send an error message > 0326.52 C ExSr MsgLenErr > 0326.53 C EndIf > 0326.55 C Endif > 0326.56 > 0327.00 C EndIf > 0328.00 > 0348.00 * ...End of Accept or Receive (current socket processing) > 0349.00 C EndIf > 0350.00 > 0351.00 * ..End of Process incoming request > 0352.00 C EndIf > 0353.00 > 0354.00 * ..End of Inspection loop > 0355.00 C EndDo > 0356.00 > 0357.00 * .End of Process all incoming requests > 0358.00 C EndIf > 0359.00 > 0360.00 * End of Processing loop > 0361.00 C EndDo > 0362.00 > > ----Original Message Follows------ > Hi all, > > I have a sockets application that I'm having a problem with, and wonder if > anyone can point me in the right direction. The system is working, but it > is also eating up the machine. > > When I run the server program in debug, I find that the return code from the > select() statement is always coming back with a value of '1'. In this > particular case I sent one message from the client. The server recognized > the activity on the socket and issued a read against it, and processed the > incomming message. It then wrote the response back to the socket. From > that point on, with every loop through the code, it continues to show a > return code of '1' for that socket, even though there are zero bytes read. > Because of this it appears the select is never sleeping as it should, and > the result is a fast running loop that is eating all the machine's > resources. > > I've attached the main part of the code. The select() is at 257. I would > appreciate any pointers you might have. > > Thanks in advance! > > > Jim Whalen > PH 972 429-8238 > jimw2001@hotmail.com > > > > > _________________________________________________________________ > Send and receive Hotmail on your mobile device: http://mobile.msn.com > > _______________________________________________ > This is the Midrange Systems Technical Discussion (MIDRANGE-L) mailing list > To post a message email: MIDRANGE-L@midrange.com > To subscribe, unsubscribe, or change list options, > visit: http://lists.midrange.com/cgi-bin/listinfo/midrange-l > or email: MIDRANGE-L-request@midrange.com > Before posting, please take a moment to review the archives > at http://archive.midrange.com/midrange-l. >
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.