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.
#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);
}
© 2008 Novell, Inc. All Rights Reserved.