Novell Home

BSD MSG OOB sample server

From Developer Community

Demonstrates MSG_OOB with select,send,recv calls. Use with BSD MSG_OOB sample client.

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>

int NLM_Exiting = FALSE;

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

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

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

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

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

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

		FD_ZERO (&fds);
		FD_SET (clientSocket, &fds);

		wait.tv_sec = 0;
		wait.tv_usec = 200;
		i = select (2, 0, 0, &fds, &wait);
		if(i != 1)
		{
			perror("select");
			//printf("\r\nthis is errno = %d\r\n", errno);
		}
		else{
			if(( recv(clientSocket, &buff, sizeof(buff), MSG_OOB)) == (-1)){
				perror("recv");
				goto END_ERR;
			}
		}

		printf("recv: %s\r\n", buff);


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

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

--Benjamin Fjeldsted

Novell® Making IT Work As One

© 2008 Novell, Inc. All Rights Reserved.