A simple echo server using BSD and CLIB using threads to service the accepted connection.
#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);
}
© 2008 Novell, Inc. All Rights Reserved.