Novell Home

Echo server using threads (BSD & CLIB)

From Developer Community

A simple echo server using BSD and CLIB using threads to service the accepted connection.

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 <nwerrno.h>

int NLM_Exiting = FALSE;

void Service(void *parm)
{
   int *tmp = (int *)parm;
   int clientSocket = *tmp;
   char buff[255];

   printf("recv ");
   if(( recv(clientSocket, buff, sizeof(buff), 0)) == (-1)){
	   perror("recv");
	   goto END_ERR;
   }


   printf("send ");
   if(( send(clientSocket, buff, strlen(buff), 0)) == (-1)){
	   perror("send");
	   goto END_ERR;
   }
   
   close(clientSocket);

END_ERR:
   ExitThread(TSR_THREAD, 1);


}

void main(void)
{
	int serverSocket;
	int clientSocket;
	int sizeofClientAddr;
	char buff[300];
	struct sockaddr_in serverAddr, clientAddr;

	printf("socket ");
	if(( serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == (-1)){
		perror("socket");
		goto END_ERR;
	}

	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons(4040);
	serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

	printf("bind ");
	if(( bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr))) == (-1)){
		perror("bind");
		goto END_ERR;
	}

	printf("listen ");
	if(( listen(serverSocket, 0)) == (-1)){
		perror("listen");
		goto END_ERR;
	}

	while(!NLM_Exiting)
	{
		sizeofClientAddr = sizeof(clientAddr);
		printf("accept");
		if(( clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &sizeofClientAddr)) == (-1)){
			perror("accept");
			goto END_ERR;
		}

		if( BeginThread(Service, NULL, 0, (void *)&clientSocket) == EFAILURE)
		{
		   perror("BeginThread");
		   goto END_ERR;
		}
		
	}

END_ERR:
	close(clientSocket);
	close(serverSocket);
}

--Benjamin Fjeldsted

Novell® Making IT Work As One

© 2008 Novell, Inc. All Rights Reserved.