As pointed out by Jeff, the defect was: to replace the line sa.sin_port = pno; with sa.sin_port = htons(pno);
His explanation of this was: <quote> Because multiple byte quantities are needed as part of the TCP/IP protocol, the protocol designers adopted a single standard for how multibyte values are sent across the network. TCP/IP mandates that big-endian byte order be used for transmitting protocol information and suggests that it be used for application data, as well. The ordering used for multibyte values sent across the network is also known as the network byte order. This is the reason why we need to use htons, to convert the short value pno from host order to network order. The reason that your program program works fine in Solaris is because Solaris ( Sparc CPU, IBM PowerPC, and MC68000 families ) is a big endian architecture. You will need to use htons ( or htonl ) in little endian platforms such as Linux, Windows, DEC Alpha,etc. Actually , The Silicon Graphics MIPS and IBM/Motorola PowerPC can be either. </quote> rahul