Novell Home

CLIB and BSD echo server

From Developer Community

A simple echo server using socket, bind, listen, accept, send, recv with BSD functions from CLIB.

Listens on address returned from gethostid and uses setsockopt with SO_REUSEADDR.

Sample Code

#include <stdio.h>
#include <sys/types.h>
#include <nlm/sys/socket.h>
#include <nlm/sys/bsdskt.h>
#include <netinet/in.h>
#include <unistd.h>
#include <nwconio.h>


#define SOCKET_ERROR -1
#define SOCKET_LOOPBACK 0x0100007F


int main( void )
{
	int iRetCode;
	int iOverallResult;
	int iServerSocket;
	int iReuseAddrVal;
	long lLocalAddr;
	int iClientSocket;
	int iSizeofClientAddr;
	char pszMsgBuffer[300];
	struct sockaddr_in sServerAddr;
	struct sockaddr_in sClientAddr;

	iOverallResult = 1;
	iServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if( iServerSocket != SOCKET_ERROR ) 
	{
		iReuseAddrVal = 1;
		iRetCode = setsockopt(iServerSocket, SOL_SOCKET,SO_REUSEADDR, char *) &iReuseAddrVal, sizeof( iReuseAddrVal));
		if( iRetCode != SOCKET_ERROR )
		{
			lLocalAddr = gethostid();
			if((lLocalAddr != SOCKET_ERROR) && (lLocalAddr != SOCKET_LOOPBACK))
			{
				sServerAddr.sin_family = AF_INET;
				sServerAddr.sin_port = htons( 2000 );
				sServerAddr.sin_addr.s_addr = lLocalAddr;
				iRetCode = bind(iServerSocket, (struct sockaddr *) &sServerAddr, sizeof(sServerAddr));
				if( iRetCode != SOCKET_ERROR )
				{
					iRetCode = listen iServerSocket, 5);
					if( iRetCode != SOCKET_ERROR )
					{
						iSizeofClientAddr = sizeof(sClientAddr);
						iClientSocket = accept(iServerSocket, (struct sockaddr *) &sClientAddr, &iSizeofClientAddr ) ;
						if(iClientSocket != SOCKET_ERROR)
						{
							memset( pszMsgBuffer, 0, sizeof(pszMsgBuffer)) ;
							iRetCode = recv(iClientSocket, pszMsgBuffer, sizeof(pszMsgBuffer), 0);
							if(iRetCode != SOCKET_ERROR)
{
	ConsolePrintf("rnreceived: %srn", pszMsgBuffer);
								iRetCode = send(iClientSocket, pszMsgBuffer, 1 + strlen(pszMsgBuffer), 0);
								if(iRetCode != SOCKET_ERROR)
	{
		iOverallResult = 0 ;
								} /* send */
							} /* recv */
							iRetCode = close(iClientSocket);
						} /* accept */
					} /* listen */
				} /* bind */
			} /* gethostid */
		} /* setsockopt */
		close( iServerSocket ) ;
	} /* socket */
	ConsolePrintf("rnresult overall: %drn" , iOverallResult);
	return(iOverallResult);
}

--Benjamin Fjeldsted

Novell® Making IT Work As One

© 2008 Novell, Inc. All Rights Reserved.