|
Simon, Have you gotten htonl() to work? I was on V4R5 until last week and when I tried to compile using htonl() it could find it anywhere. I suppose I should try again on V5R3. -Bob Cozzi www.RPGxTools.com RPG xTools - Enjoy programming again. -----Original Message----- From: rpg400-l-bounces+cozzi=rpgiv.com@xxxxxxxxxxxx [mailto:rpg400-l-bounces+cozzi=rpgiv.com@xxxxxxxxxxxx] On Behalf Of Simon Coulter Sent: Saturday, February 04, 2006 4:47 AM To: RPG programming on the AS400 / iSeries Subject: Re: SOCKET Connect() connects but shouldn't. On 04/02/2006, at 1:57 PM, Dave Johnson wrote: > I am trying to figure out some basic sockets programming using Scott > Klement's tutorial. This is an excellent tutorial! > > Here is the problem I am finding. > > I use the code from Scott's sample: Code deleted. > and it works fine. The problem is that it shouldn't work because I do > not actually have a socket server listening on the port I specify in > the SIN_PORT paramater. That is, if I use a port # of 8540 in SIN_PORT > for example but my socket server is actually listening on port 3994, > then I should get an error, right? But I don't. Instead, I get the > return value = 0 and the program continues on. > > If it makes a difference, my socket server is running on a pc and I > use the DOS command NETSTAT -a to see what is active on all the ports. > I see my socket server listening on port 3994 and nothing on 8540, > and yet the connect does not return a negative value. > > Obviously I am missing something here, but I am so new at this stuff > that I cannot see what it is. > > Anyone have any ideas of things I could check? Couple of things: First, byte-ordering. The bytes for network values must be in network byte order. This happens to be big-endian but PCs and other toys use little-endian thus your port number is probably being misinterpreted. You should always use the byte-order conversion functions when setting values in a socket address structure. c eval sin_addr = htonl(IP) c eval sin_port = htons(port) The example code you showed will work on OS/400 because it is a big-endian system. Given your specified port of 8540 which in hex is 215C which in little-endian is 5C21 which will be interpreted as port 23585 by the socket code on a PC. A similar misinterpretation will occur with the IP address so you may be attempting to connect to a completely different server which does happen to have a listener on port 23585. Secondly, it is not apparent from your code but I presume IP is a 32-bit integer value and NOT the dotted-decimal form of the address. If it is the dotted-decimal address (i.e., a character value) then you will have to convert from the dotted-decimal form to the network form using inet_addr or inet_aton (or inet_pton if you want IPv6 compatibility). Thirdly, you should be checking errno when a socket function indicates an error condition. This will give you a better** indication of the reason for the failure. For example, ETIMEDOUT, EHOSTUNREACH, or ENETUNREACH if no server is found or ECONNREFUSED if no listener is active on the target port. Try running the example code on OS/400 and see what happens. **better is a relative term: in this case it means better by Unix standards which are quite pathetic by OS/400 standards but better than nothing. Regards, Simon Coulter. -------------------------------------------------------------------- FlyByNight Software AS/400 Technical Specialists http://www.flybynight.com.au/ Phone: +61 3 9419 0175 Mobile: +61 0411 091 400 /"\ Fax: +61 3 9419 0175 \ / X ASCII Ribbon campaign against HTML E-Mail / \ --------------------------------------------------------------------
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.